mirror of
https://git.libssh.org/projects/libssh.git
synced 2026-02-11 10:40:27 +09:00
pki_gcrypt: Use SSH_BUFFER_FREE()
Fixes T183
Signed-off-by: Andreas Schneider <asn@cryptomilk.org>
Reviewed-by: Jakub Jelen <jjelen@redhat.com>
(cherry picked from commit 9a112f1548)
This commit is contained in:
@@ -434,7 +434,7 @@ static ssh_buffer privatekey_string_to_buffer(const char *pkey, int type,
|
|||||||
header_end = ECDSA_HEADER_END;
|
header_end = ECDSA_HEADER_END;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ssh_buffer_free(buffer);
|
SSH_BUFFER_FREE(buffer);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -450,14 +450,14 @@ static ssh_buffer privatekey_string_to_buffer(const char *pkey, int type,
|
|||||||
get_next_line(p, len);
|
get_next_line(p, len);
|
||||||
}
|
}
|
||||||
if (eol) {
|
if (eol) {
|
||||||
ssh_buffer_free(buffer);
|
SSH_BUFFER_FREE(buffer);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* skip header line */
|
/* skip header line */
|
||||||
get_next_line(p, len);
|
get_next_line(p, len);
|
||||||
if (eol) {
|
if (eol) {
|
||||||
ssh_buffer_free(buffer);
|
SSH_BUFFER_FREE(buffer);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -465,7 +465,7 @@ static ssh_buffer privatekey_string_to_buffer(const char *pkey, int type,
|
|||||||
/* skip line */
|
/* skip line */
|
||||||
get_next_line(p, len);
|
get_next_line(p, len);
|
||||||
if (eol) {
|
if (eol) {
|
||||||
ssh_buffer_free(buffer);
|
SSH_BUFFER_FREE(buffer);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -474,24 +474,24 @@ static ssh_buffer privatekey_string_to_buffer(const char *pkey, int type,
|
|||||||
len = 0;
|
len = 0;
|
||||||
get_next_line(p, len);
|
get_next_line(p, len);
|
||||||
if (eol) {
|
if (eol) {
|
||||||
ssh_buffer_free(buffer);
|
SSH_BUFFER_FREE(buffer);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (privatekey_dek_header(p, len, &algo, &mode, &key_len,
|
if (privatekey_dek_header(p, len, &algo, &mode, &key_len,
|
||||||
&iv, &iv_len) < 0) {
|
&iv, &iv_len) < 0) {
|
||||||
ssh_buffer_free(buffer);
|
SSH_BUFFER_FREE(buffer);
|
||||||
SAFE_FREE(iv);
|
SAFE_FREE(iv);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ssh_buffer_free(buffer);
|
SSH_BUFFER_FREE(buffer);
|
||||||
SAFE_FREE(iv);
|
SAFE_FREE(iv);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if(len > 0) {
|
if(len > 0) {
|
||||||
if (ssh_buffer_add_data(buffer, p, len) < 0) {
|
if (ssh_buffer_add_data(buffer, p, len) < 0) {
|
||||||
ssh_buffer_free(buffer);
|
SSH_BUFFER_FREE(buffer);
|
||||||
SAFE_FREE(iv);
|
SAFE_FREE(iv);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -501,7 +501,7 @@ static ssh_buffer privatekey_string_to_buffer(const char *pkey, int type,
|
|||||||
get_next_line(p, len);
|
get_next_line(p, len);
|
||||||
while(!eol && strncmp(p, header_end, header_end_size) != 0) {
|
while(!eol && strncmp(p, header_end, header_end_size) != 0) {
|
||||||
if (ssh_buffer_add_data(buffer, p, len) < 0) {
|
if (ssh_buffer_add_data(buffer, p, len) < 0) {
|
||||||
ssh_buffer_free(buffer);
|
SSH_BUFFER_FREE(buffer);
|
||||||
SAFE_FREE(iv);
|
SAFE_FREE(iv);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -509,19 +509,19 @@ static ssh_buffer privatekey_string_to_buffer(const char *pkey, int type,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (eol || strncmp(p, header_end, header_end_size) != 0) {
|
if (eol || strncmp(p, header_end, header_end_size) != 0) {
|
||||||
ssh_buffer_free(buffer);
|
SSH_BUFFER_FREE(buffer);
|
||||||
SAFE_FREE(iv);
|
SAFE_FREE(iv);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ssh_buffer_add_data(buffer, "\0", 1) < 0) {
|
if (ssh_buffer_add_data(buffer, "\0", 1) < 0) {
|
||||||
ssh_buffer_free(buffer);
|
SSH_BUFFER_FREE(buffer);
|
||||||
SAFE_FREE(iv);
|
SAFE_FREE(iv);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
out = base64_to_bin(ssh_buffer_get(buffer));
|
out = base64_to_bin(ssh_buffer_get(buffer));
|
||||||
ssh_buffer_free(buffer);
|
SSH_BUFFER_FREE(buffer);
|
||||||
if (out == NULL) {
|
if (out == NULL) {
|
||||||
SAFE_FREE(iv);
|
SAFE_FREE(iv);
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -530,7 +530,7 @@ static ssh_buffer privatekey_string_to_buffer(const char *pkey, int type,
|
|||||||
if (algo) {
|
if (algo) {
|
||||||
if (privatekey_decrypt(algo, mode, key_len, iv, iv_len, out,
|
if (privatekey_decrypt(algo, mode, key_len, iv, iv_len, out,
|
||||||
cb, userdata, desc) < 0) {
|
cb, userdata, desc) < 0) {
|
||||||
ssh_buffer_free(out);
|
SSH_BUFFER_FREE(out);
|
||||||
SAFE_FREE(iv);
|
SAFE_FREE(iv);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -561,20 +561,20 @@ static int b64decode_rsa_privatekey(const char *pkey, gcry_sexp_t *r,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!asn1_check_sequence(buffer)) {
|
if (!asn1_check_sequence(buffer)) {
|
||||||
ssh_buffer_free(buffer);
|
SSH_BUFFER_FREE(buffer);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
v = asn1_get_int(buffer);
|
v = asn1_get_int(buffer);
|
||||||
if (v == NULL) {
|
if (v == NULL) {
|
||||||
ssh_buffer_free(buffer);
|
SSH_BUFFER_FREE(buffer);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
data = ssh_string_data(v);
|
data = ssh_string_data(v);
|
||||||
if (ssh_string_len(v) != 1 || data[0] != 0) {
|
if (ssh_string_len(v) != 1 || data[0] != 0) {
|
||||||
SSH_STRING_FREE(v);
|
SSH_STRING_FREE(v);
|
||||||
ssh_buffer_free(buffer);
|
SSH_BUFFER_FREE(buffer);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -587,7 +587,7 @@ static int b64decode_rsa_privatekey(const char *pkey, gcry_sexp_t *r,
|
|||||||
unused2 = asn1_get_int(buffer);
|
unused2 = asn1_get_int(buffer);
|
||||||
u = asn1_get_int(buffer);
|
u = asn1_get_int(buffer);
|
||||||
|
|
||||||
ssh_buffer_free(buffer);
|
SSH_BUFFER_FREE(buffer);
|
||||||
|
|
||||||
if (n == NULL || e == NULL || d == NULL || p == NULL || q == NULL ||
|
if (n == NULL || e == NULL || d == NULL || p == NULL || q == NULL ||
|
||||||
unused1 == NULL || unused2 == NULL|| u == NULL) {
|
unused1 == NULL || unused2 == NULL|| u == NULL) {
|
||||||
@@ -644,20 +644,20 @@ static int b64decode_dsa_privatekey(const char *pkey, gcry_sexp_t *r, ssh_auth_c
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!asn1_check_sequence(buffer)) {
|
if (!asn1_check_sequence(buffer)) {
|
||||||
ssh_buffer_free(buffer);
|
SSH_BUFFER_FREE(buffer);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
v = asn1_get_int(buffer);
|
v = asn1_get_int(buffer);
|
||||||
if (v == NULL) {
|
if (v == NULL) {
|
||||||
ssh_buffer_free(buffer);
|
SSH_BUFFER_FREE(buffer);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
data = ssh_string_data(v);
|
data = ssh_string_data(v);
|
||||||
if (ssh_string_len(v) != 1 || data[0] != 0) {
|
if (ssh_string_len(v) != 1 || data[0] != 0) {
|
||||||
SSH_STRING_FREE(v);
|
SSH_STRING_FREE(v);
|
||||||
ssh_buffer_free(buffer);
|
SSH_BUFFER_FREE(buffer);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -666,7 +666,7 @@ static int b64decode_dsa_privatekey(const char *pkey, gcry_sexp_t *r, ssh_auth_c
|
|||||||
g = asn1_get_int(buffer);
|
g = asn1_get_int(buffer);
|
||||||
y = asn1_get_int(buffer);
|
y = asn1_get_int(buffer);
|
||||||
x = asn1_get_int(buffer);
|
x = asn1_get_int(buffer);
|
||||||
ssh_buffer_free(buffer);
|
SSH_BUFFER_FREE(buffer);
|
||||||
|
|
||||||
if (p == NULL || q == NULL || g == NULL || y == NULL || x == NULL) {
|
if (p == NULL || q == NULL || g == NULL || y == NULL || x == NULL) {
|
||||||
rc = 0;
|
rc = 0;
|
||||||
@@ -916,7 +916,7 @@ static int b64decode_ecdsa_privatekey(const char *pkey, gcry_sexp_t *r,
|
|||||||
}
|
}
|
||||||
|
|
||||||
error:
|
error:
|
||||||
ssh_buffer_free(buffer);
|
SSH_BUFFER_FREE(buffer);
|
||||||
SSH_STRING_FREE(v);
|
SSH_STRING_FREE(v);
|
||||||
ssh_string_burn(d);
|
ssh_string_burn(d);
|
||||||
SSH_STRING_FREE(d);
|
SSH_STRING_FREE(d);
|
||||||
@@ -1560,7 +1560,7 @@ ssh_string pki_publickey_to_blob(const ssh_key key)
|
|||||||
if (key->cert != NULL) {
|
if (key->cert != NULL) {
|
||||||
rc = ssh_buffer_add_buffer(buffer, key->cert);
|
rc = ssh_buffer_add_buffer(buffer, key->cert);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
ssh_buffer_free(buffer);
|
SSH_BUFFER_FREE(buffer);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
goto makestring;
|
goto makestring;
|
||||||
@@ -1568,14 +1568,14 @@ ssh_string pki_publickey_to_blob(const ssh_key key)
|
|||||||
|
|
||||||
type_s = ssh_string_from_char(key->type_c);
|
type_s = ssh_string_from_char(key->type_c);
|
||||||
if (type_s == NULL) {
|
if (type_s == NULL) {
|
||||||
ssh_buffer_free(buffer);
|
SSH_BUFFER_FREE(buffer);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = ssh_buffer_add_ssh_string(buffer, type_s);
|
rc = ssh_buffer_add_ssh_string(buffer, type_s);
|
||||||
SSH_STRING_FREE(type_s);
|
SSH_STRING_FREE(type_s);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
ssh_buffer_free(buffer);
|
SSH_BUFFER_FREE(buffer);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1685,21 +1685,21 @@ ssh_string pki_publickey_to_blob(const ssh_key key)
|
|||||||
type_s = ssh_string_from_char(
|
type_s = ssh_string_from_char(
|
||||||
pki_key_ecdsa_nid_to_char(key->ecdsa_nid));
|
pki_key_ecdsa_nid_to_char(key->ecdsa_nid));
|
||||||
if (type_s == NULL) {
|
if (type_s == NULL) {
|
||||||
ssh_buffer_free(buffer);
|
SSH_BUFFER_FREE(buffer);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = ssh_buffer_add_ssh_string(buffer, type_s);
|
rc = ssh_buffer_add_ssh_string(buffer, type_s);
|
||||||
SSH_STRING_FREE(type_s);
|
SSH_STRING_FREE(type_s);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
ssh_buffer_free(buffer);
|
SSH_BUFFER_FREE(buffer);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
e = ssh_sexp_extract_mpi(key->ecdsa, "q", GCRYMPI_FMT_STD,
|
e = ssh_sexp_extract_mpi(key->ecdsa, "q", GCRYMPI_FMT_STD,
|
||||||
GCRYMPI_FMT_STD);
|
GCRYMPI_FMT_STD);
|
||||||
if (e == NULL) {
|
if (e == NULL) {
|
||||||
ssh_buffer_free(buffer);
|
SSH_BUFFER_FREE(buffer);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1729,11 +1729,11 @@ makestring:
|
|||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
ssh_buffer_free(buffer);
|
SSH_BUFFER_FREE(buffer);
|
||||||
|
|
||||||
return str;
|
return str;
|
||||||
fail:
|
fail:
|
||||||
ssh_buffer_free(buffer);
|
SSH_BUFFER_FREE(buffer);
|
||||||
ssh_string_burn(str);
|
ssh_string_burn(str);
|
||||||
SSH_STRING_FREE(str);
|
SSH_STRING_FREE(str);
|
||||||
ssh_string_burn(e);
|
ssh_string_burn(e);
|
||||||
@@ -1852,40 +1852,40 @@ ssh_string pki_signature_to_blob(const ssh_signature sig)
|
|||||||
R = ssh_sexp_extract_mpi(sig->ecdsa_sig, "r",
|
R = ssh_sexp_extract_mpi(sig->ecdsa_sig, "r",
|
||||||
GCRYMPI_FMT_USG, GCRYMPI_FMT_STD);
|
GCRYMPI_FMT_USG, GCRYMPI_FMT_STD);
|
||||||
if (R == NULL) {
|
if (R == NULL) {
|
||||||
ssh_buffer_free(b);
|
SSH_BUFFER_FREE(b);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = ssh_buffer_add_ssh_string(b, R);
|
rc = ssh_buffer_add_ssh_string(b, R);
|
||||||
SSH_STRING_FREE(R);
|
SSH_STRING_FREE(R);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
ssh_buffer_free(b);
|
SSH_BUFFER_FREE(b);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
S = ssh_sexp_extract_mpi(sig->ecdsa_sig, "s",
|
S = ssh_sexp_extract_mpi(sig->ecdsa_sig, "s",
|
||||||
GCRYMPI_FMT_USG, GCRYMPI_FMT_STD);
|
GCRYMPI_FMT_USG, GCRYMPI_FMT_STD);
|
||||||
if (S == NULL) {
|
if (S == NULL) {
|
||||||
ssh_buffer_free(b);
|
SSH_BUFFER_FREE(b);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = ssh_buffer_add_ssh_string(b, S);
|
rc = ssh_buffer_add_ssh_string(b, S);
|
||||||
SSH_STRING_FREE(S);
|
SSH_STRING_FREE(S);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
ssh_buffer_free(b);
|
SSH_BUFFER_FREE(b);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
sig_blob = ssh_string_new(ssh_buffer_get_len(b));
|
sig_blob = ssh_string_new(ssh_buffer_get_len(b));
|
||||||
if (sig_blob == NULL) {
|
if (sig_blob == NULL) {
|
||||||
ssh_buffer_free(b);
|
SSH_BUFFER_FREE(b);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ssh_string_fill(sig_blob,
|
ssh_string_fill(sig_blob,
|
||||||
ssh_buffer_get(b), ssh_buffer_get_len(b));
|
ssh_buffer_get(b), ssh_buffer_get_len(b));
|
||||||
ssh_buffer_free(b);
|
SSH_BUFFER_FREE(b);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -2019,21 +2019,21 @@ ssh_signature pki_signature_from_blob(const ssh_key pubkey,
|
|||||||
ssh_string_data(sig_blob),
|
ssh_string_data(sig_blob),
|
||||||
ssh_string_len(sig_blob));
|
ssh_string_len(sig_blob));
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
ssh_buffer_free(b);
|
SSH_BUFFER_FREE(b);
|
||||||
ssh_signature_free(sig);
|
ssh_signature_free(sig);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
r = ssh_buffer_get_ssh_string(b);
|
r = ssh_buffer_get_ssh_string(b);
|
||||||
if (r == NULL) {
|
if (r == NULL) {
|
||||||
ssh_buffer_free(b);
|
SSH_BUFFER_FREE(b);
|
||||||
ssh_signature_free(sig);
|
ssh_signature_free(sig);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
s = ssh_buffer_get_ssh_string(b);
|
s = ssh_buffer_get_ssh_string(b);
|
||||||
rlen = ssh_buffer_get_len(b);
|
rlen = ssh_buffer_get_len(b);
|
||||||
ssh_buffer_free(b);
|
SSH_BUFFER_FREE(b);
|
||||||
if (s == NULL) {
|
if (s == NULL) {
|
||||||
ssh_string_burn(r);
|
ssh_string_burn(r);
|
||||||
SSH_STRING_FREE(r);
|
SSH_STRING_FREE(r);
|
||||||
|
|||||||
Reference in New Issue
Block a user