summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS3
-rw-r--r--lib/gnutls_sig.c3
-rw-r--r--lib/x509/common.c2
-rw-r--r--lib/x509/common.h3
-rw-r--r--lib/x509/mpi.c5
-rw-r--r--lib/x509/sign.c2
-rw-r--r--lib/x509/verify.c4
7 files changed, 16 insertions, 6 deletions
diff --git a/NEWS b/NEWS
index 3bdd35c5a1..132af9d08e 100644
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,9 @@ See the end for copying conditions.
* Version 2.11.6 (unreleased)
+** libgnutls: Use ASN1_NULL when writing parameters for RSA signatures.
+This makes us comply with RFC3279. Reported by Michael Rommel.
+
** gnutls-serv: Corrected a buffer overflow. Reported and patch by Tomas Mraz.
** API and ABI modifications:
diff --git a/lib/gnutls_sig.c b/lib/gnutls_sig.c
index 13ad46aa07..165a6dc03a 100644
--- a/lib/gnutls_sig.c
+++ b/lib/gnutls_sig.c
@@ -40,6 +40,7 @@
#include <libtasn1.h>
#include <ext_signature.h>
#include <gnutls_state.h>
+#include <x509/common.h>
static int
_gnutls_tls_sign (gnutls_session_t session,
@@ -90,7 +91,7 @@ _gnutls_rsa_encode_sig (gnutls_mac_algorithm_t algo,
/* Use NULL parameters. */
if ((result = asn1_write_value (di, "digestAlgorithm.parameters",
- "\x05\x00", 2)) != ASN1_SUCCESS)
+ ASN1_NULL, ASN1_NULL_SIZE)) != ASN1_SUCCESS)
{
gnutls_assert ();
asn1_delete_structure (&di);
diff --git a/lib/x509/common.c b/lib/x509/common.c
index 44b852827c..c90b4e2d5e 100644
--- a/lib/x509/common.c
+++ b/lib/x509/common.c
@@ -1226,7 +1226,7 @@ _gnutls_x509_encode_and_copy_PKI_params (ASN1_TYPE dst,
_asnstr_append_name (name, sizeof (name), dst_name,
".algorithm.parameters");
- result = asn1_write_value (dst, name, NULL, 0);
+ result = asn1_write_value (dst, name, ASN1_NULL, ASN1_NULL_SIZE);
if (result != ASN1_SUCCESS)
{
gnutls_assert ();
diff --git a/lib/x509/common.h b/lib/x509/common.h
index c6c2406c56..62468248ca 100644
--- a/lib/x509/common.h
+++ b/lib/x509/common.h
@@ -64,6 +64,9 @@
#define SIG_GOST_R3410_94_OID "1.2.643.2.2.4"
#define SIG_GOST_R3410_2001_OID "1.2.643.2.2.3"
+#define ASN1_NULL "\x05\x00"
+#define ASN1_NULL_SIZE 2
+
int _gnutls_x509_set_time (ASN1_TYPE c2, const char *where, time_t tim);
int _gnutls_x509_decode_octet_string (const char *string_type,
diff --git a/lib/x509/mpi.c b/lib/x509/mpi.c
index 2ce6a53ef7..4b1aa169ed 100644
--- a/lib/x509/mpi.c
+++ b/lib/x509/mpi.c
@@ -456,7 +456,10 @@ _gnutls_x509_write_sig_params (ASN1_TYPE dst, const char *dst_name,
_gnutls_str_cpy (name, sizeof (name), dst_name);
_gnutls_str_cat (name, sizeof (name), ".parameters");
- result = asn1_write_value (dst, name, NULL, 0);
+ if (pk_algorithm == GNUTLS_PK_RSA)
+ result = asn1_write_value (dst, name, ASN1_NULL, ASN1_NULL_SIZE);
+ else
+ result = asn1_write_value (dst, name, NULL, 0);
if (result != ASN1_SUCCESS && result != ASN1_ELEMENT_NOT_FOUND)
{
diff --git a/lib/x509/sign.c b/lib/x509/sign.c
index cab6c046d2..1151300c6c 100644
--- a/lib/x509/sign.c
+++ b/lib/x509/sign.c
@@ -86,7 +86,7 @@ encode_ber_digest_info (gnutls_digest_algorithm_t hash,
Regardless of what is correct, this appears to be what most
implementations do. */
result = asn1_write_value (dinfo, "digestAlgorithm.parameters",
- "\x05\x00", 2);
+ ASN1_NULL, ASN1_NULL_SIZE);
if (result != ASN1_SUCCESS)
{
gnutls_assert ();
diff --git a/lib/x509/verify.c b/lib/x509/verify.c
index c845e6fae2..e7cdc74526 100644
--- a/lib/x509/verify.c
+++ b/lib/x509/verify.c
@@ -684,8 +684,8 @@ decode_ber_digest_info (const gnutls_datum_t * info,
/* To avoid permitting garbage in the parameters field, either the
parameters field is not present, or it contains 0x05 0x00. */
if (!(result == ASN1_ELEMENT_NOT_FOUND ||
- (result == ASN1_SUCCESS && len == 2 &&
- str[0] == 0x05 && str[1] == 0x00)))
+ (result == ASN1_SUCCESS && len == ASN1_NULL_SIZE &&
+ memcmp(str, ASN1_NULL, ASN1_NULL_SIZE) == 0)))
{
gnutls_assert ();
asn1_delete_structure (&dinfo);