summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Eremin-Solenikov <dbaryshkov@gmail.com>2019-07-17 19:41:47 +0300
committerDmitry Eremin-Solenikov <dbaryshkov@gmail.com>2019-12-18 23:42:47 +0300
commit4ecbe4a158403bcb46a1f5872eaa397d51ad8f7c (patch)
tree64a958dec726f69ad4aa4a10de3e1ff171535371
parent4dbf2b794308c23da8a3f132cc07372f2764f062 (diff)
downloadgnutls-4ecbe4a158403bcb46a1f5872eaa397d51ad8f7c.tar.gz
ext/signature: use GOST signatures for GOST ciphersiuites
draft-smyshlyaev-tls12-gost-suites limits SignatureAndHash algorithms in CertificateRequest message to GOST values if GOST cipher suite is selected. Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
-rw-r--r--lib/algorithms.h10
-rw-r--r--lib/ext/signature.c6
2 files changed, 16 insertions, 0 deletions
diff --git a/lib/algorithms.h b/lib/algorithms.h
index a01cc9cb8c..fadf269871 100644
--- a/lib/algorithms.h
+++ b/lib/algorithms.h
@@ -496,6 +496,16 @@ static inline unsigned _gnutls_kx_is_vko_gost(gnutls_kx_algorithm_t kx)
return 0;
}
+static inline bool
+_sign_is_gost(const gnutls_sign_entry_st *se)
+{
+ gnutls_pk_algorithm_t pk = se->pk;
+
+ return (pk == GNUTLS_PK_GOST_01) ||
+ (pk == GNUTLS_PK_GOST_12_256) ||
+ (pk == GNUTLS_PK_GOST_12_512);
+}
+
static inline int _sig_is_ecdsa(gnutls_sign_algorithm_t sig)
{
if (sig == GNUTLS_SIGN_ECDSA_SHA1 || sig == GNUTLS_SIGN_ECDSA_SHA224 ||
diff --git a/lib/ext/signature.c b/lib/ext/signature.c
index 8dba4c6ca7..3f3652f51e 100644
--- a/lib/ext/signature.c
+++ b/lib/ext/signature.c
@@ -97,6 +97,12 @@ _gnutls_sign_algorithm_write_params(gnutls_session_t session,
if (prev && prev->id[0] == aid->id[0] && prev->id[1] == aid->id[1])
continue;
+ /* Ignore non-GOST sign types for CertReq */
+ if (session->security_parameters.cs &&
+ _gnutls_kx_is_vko_gost(session->security_parameters.cs->kx_algorithm) &&
+ !_sign_is_gost(session->internals.priorities->sigalg.entry[i]))
+ continue;
+
_gnutls_handshake_log
("EXT[%p]: sent signature algo (%d.%d) %s\n", session,
(int)aid->id[0], (int)aid->id[1],