diff options
-rw-r--r-- | NEWS | 3 | ||||
-rw-r--r-- | lib/gnutls_sig.c | 3 | ||||
-rw-r--r-- | lib/x509/common.c | 2 | ||||
-rw-r--r-- | lib/x509/common.h | 3 | ||||
-rw-r--r-- | lib/x509/mpi.c | 5 | ||||
-rw-r--r-- | lib/x509/sign.c | 2 | ||||
-rw-r--r-- | lib/x509/verify.c | 4 |
7 files changed, 16 insertions, 6 deletions
@@ -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); |