]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
_gnutls_pk_derive: add argument for nonce
authorDmitry Eremin-Solenikov <dbaryshkov@gmail.com>
Thu, 27 Oct 2016 15:58:12 +0000 (18:58 +0300)
committerDmitry Eremin-Solenikov <dbaryshkov@gmail.com>
Thu, 7 Nov 2019 15:41:28 +0000 (18:41 +0300)
GOST VKO key derivation needs another opaque argument (called UKM).
Add an argument to _gnutls_pk_derive to accomodate that keying material.

Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
lib/crypto-backend.h
lib/nettle/pk.c
lib/pk.h

index 33eca6031cde8b890cb4a249d408abaeca3e46ec..a3c52d4da8fecce3ef07a415ad7558279425907d 100644 (file)
@@ -397,6 +397,7 @@ typedef struct gnutls_crypto_pk {
        int (*derive) (gnutls_pk_algorithm_t, gnutls_datum_t * out,
                       const gnutls_pk_params_st * priv,
                       const gnutls_pk_params_st * pub,
+                      const gnutls_datum_t *nonce,
                       unsigned int flags);
 
        int (*curve_exists) (gnutls_ecc_curve_t);       /* true/false */
index b6bb7355668175db2cc01e546845d238ce02ebc7..bfa6ae437227a18930d14b257582df86c3e80c75 100644 (file)
@@ -242,6 +242,7 @@ static int _wrap_nettle_pk_derive(gnutls_pk_algorithm_t algo,
                                  gnutls_datum_t * out,
                                  const gnutls_pk_params_st * priv,
                                  const gnutls_pk_params_st * pub,
+                                 const gnutls_datum_t * nonce,
                                  unsigned int flags)
 {
        int ret;
@@ -252,6 +253,9 @@ static int _wrap_nettle_pk_derive(gnutls_pk_algorithm_t algo,
                bigint_t k = NULL, ff = NULL, r = NULL;
                unsigned int bits;
 
+               if (nonce != NULL)
+                       return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
+
                f = pub->params[DH_Y];
                x = priv->params[DH_X];
                q = priv->params[DH_Q];
@@ -343,6 +347,9 @@ dh_cleanup:
 
                        out->data = NULL;
 
+                       if (nonce != NULL)
+                               return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
+
                        curve = get_supported_nist_curve(priv->curve);
                        if (curve == NULL)
                                return
@@ -384,6 +391,9 @@ dh_cleanup:
                {
                        unsigned size = gnutls_ecc_curve_get_size(priv->curve);
 
+                       if (nonce != NULL)
+                               return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
+
                        /* The point is in pub, while the private part (scalar) in priv. */
 
                        if (size == 0 || priv->raw_priv.size != size)
index 6c83cfa295638737813c4d6331f965b2b30fe83c..cc61e08ceff6cb09ffcd09ac658adbda3e370ba1 100644 (file)
--- a/lib/pk.h
+++ b/lib/pk.h
@@ -33,8 +33,9 @@ extern gnutls_crypto_pk_st _gnutls_pk_ops;
 #define _gnutls_pk_verify( algo, data, sig, params, sign_params) _gnutls_pk_ops.verify( algo, data, sig, params, sign_params)
 #define _gnutls_pk_verify_priv_params( algo, params) _gnutls_pk_ops.verify_priv_params( algo, params)
 #define _gnutls_pk_verify_pub_params( algo, params) _gnutls_pk_ops.verify_pub_params( algo, params)
-#define _gnutls_pk_derive( algo, out, pub, priv) _gnutls_pk_ops.derive( algo, out, pub, priv, 0)
-#define _gnutls_pk_derive_tls13( algo, out, pub, priv) _gnutls_pk_ops.derive( algo, out, pub, priv, PK_DERIVE_TLS13)
+#define _gnutls_pk_derive( algo, out, pub, priv) _gnutls_pk_ops.derive( algo, out, pub, priv, NULL, 0)
+#define _gnutls_pk_derive_nonce( algo, out, pub, priv, nonce) _gnutls_pk_ops.derive( algo, out, pub, priv, nonce, 0)
+#define _gnutls_pk_derive_tls13( algo, out, pub, priv) _gnutls_pk_ops.derive( algo, out, pub, priv, NULL, PK_DERIVE_TLS13)
 #define _gnutls_pk_generate_keys( algo, bits, params, temporal) _gnutls_pk_ops.generate_keys( algo, bits, params, temporal)
 #define _gnutls_pk_generate_params( algo, bits, priv) _gnutls_pk_ops.generate_params( algo, bits, priv)
 #define _gnutls_pk_hash_algorithm( pk, sig, params, hash) _gnutls_pk_ops.hash_algorithm(pk, sig, params, hash)