summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@gnutls.org>2014-12-24 19:08:54 +0200
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2014-12-24 19:25:10 +0200
commit8ea2ef59b4eecaed0106093038ffeb98fe710f65 (patch)
treef3c7adac6350cf946b5381dab3f085e2b7321b74
parent4e1f75e90a9f8ea99cf48b8653c4c3b664d59735 (diff)
downloadgnutls-8ea2ef59b4eecaed0106093038ffeb98fe710f65.tar.gz
Corrected encoding and decoding of ANSI X9.62
That affects gnutls_pubkey_export_ecc_x962() and gnutls_pubkey_import_ecc_x962().
-rw-r--r--lib/gnutls_pubkey.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/lib/gnutls_pubkey.c b/lib/gnutls_pubkey.c
index 99d5f24a5e..555580610b 100644
--- a/lib/gnutls_pubkey.c
+++ b/lib/gnutls_pubkey.c
@@ -961,21 +961,33 @@ int gnutls_pubkey_export_ecc_x962(gnutls_pubkey_t key,
gnutls_datum_t * ecpoint)
{
int ret;
+ gnutls_datum_t raw_point = {NULL,0};
if (key == NULL || key->pk_algorithm != GNUTLS_PK_EC)
return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
- ret = _gnutls_x509_write_ecc_pubkey(&key->params, ecpoint);
+ ret = _gnutls_x509_write_ecc_pubkey(&key->params, &raw_point);
if (ret < 0)
return gnutls_assert_val(ret);
+ ret = _gnutls_x509_encode_string(ASN1_ETYPE_OCTET_STRING,
+ raw_point.data, raw_point.size, ecpoint);
+ if (ret < 0) {
+ gnutls_assert();
+ goto cleanup;
+ }
+
ret = _gnutls_x509_write_ecc_params(key->params.flags, parameters);
if (ret < 0) {
_gnutls_free_datum(ecpoint);
- return gnutls_assert_val(ret);
+ gnutls_assert();
+ goto cleanup;
}
- return 0;
+ ret = 0;
+ cleanup:
+ gnutls_free(raw_point.data);
+ return ret;
}
/**
@@ -1374,6 +1386,7 @@ gnutls_pubkey_import_ecc_x962(gnutls_pubkey_t key,
const gnutls_datum_t * ecpoint)
{
int ret;
+ gnutls_datum_t raw_point = {NULL,0};
if (key == NULL) {
gnutls_assert();
@@ -1390,7 +1403,14 @@ gnutls_pubkey_import_ecc_x962(gnutls_pubkey_t key,
goto cleanup;
}
- ret = _gnutls_ecc_ansi_x963_import(ecpoint->data, ecpoint->size,
+ ret = _gnutls_x509_decode_string(ASN1_ETYPE_OCTET_STRING,
+ ecpoint->data, ecpoint->size, &raw_point);
+ if (ret < 0) {
+ gnutls_assert();
+ goto cleanup;
+ }
+
+ ret = _gnutls_ecc_ansi_x963_import(raw_point.data, raw_point.size,
&key->params.params[ECC_X],
&key->params.params[ECC_Y]);
if (ret < 0) {
@@ -1400,10 +1420,12 @@ gnutls_pubkey_import_ecc_x962(gnutls_pubkey_t key,
key->params.params_nr += 2;
key->pk_algorithm = GNUTLS_PK_EC;
+ gnutls_free(raw_point.data);
return 0;
cleanup:
gnutls_pk_params_release(&key->params);
+ gnutls_free(raw_point.data);
return ret;
}