]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
gnutls_pubkey_import_privkey: support GNUTLS_PK_DH
authorDaiki Ueno <ueno@gnu.org>
Sun, 10 Sep 2023 22:23:51 +0000 (07:23 +0900)
committerDaiki Ueno <ueno@gnu.org>
Mon, 11 Sep 2023 05:05:52 +0000 (14:05 +0900)
Signed-off-by: Daiki Ueno <ueno@gnu.org>
lib/pk.c
lib/privkey.c

index cb023e2f23191b95d1ea4f18ca63e3a71aa13e82..533a45b8747ad818a7a2d2ffa1099ba4c574f5cf 100644 (file)
--- a/lib/pk.c
+++ b/lib/pk.c
@@ -478,9 +478,11 @@ int _gnutls_pk_params_copy(gnutls_pk_params_st *dst,
        dst->algo = src->algo;
 
        for (i = 0; i < src->params_nr; i++) {
-               dst->params[i] = _gnutls_mpi_copy(src->params[i]);
-               if (dst->params[i] == NULL) {
-                       goto fail;
+               if (src->params[i]) {
+                       dst->params[i] = _gnutls_mpi_copy(src->params[i]);
+                       if (dst->params[i] == NULL) {
+                               goto fail;
+                       }
                }
 
                dst->params_nr++;
index 27095bb50ec998490842b2f6bfba43fc321a8d99..3514e515144302a040419f9467f278cc68fd6a64 100644 (file)
@@ -181,20 +181,45 @@ static int privkey_to_pubkey(gnutls_pk_algorithm_t pk,
 
                break;
        case GNUTLS_PK_DSA:
-               pub->params[0] = _gnutls_mpi_copy(priv->params[0]);
-               pub->params[1] = _gnutls_mpi_copy(priv->params[1]);
-               pub->params[2] = _gnutls_mpi_copy(priv->params[2]);
-               pub->params[3] = _gnutls_mpi_copy(priv->params[3]);
+               pub->params[DSA_P] = _gnutls_mpi_copy(priv->params[DSA_P]);
+               pub->params[DSA_Q] = _gnutls_mpi_copy(priv->params[DSA_Q]);
+               pub->params[DSA_G] = _gnutls_mpi_copy(priv->params[DSA_G]);
+               pub->params[DSA_Y] = _gnutls_mpi_copy(priv->params[DSA_Y]);
 
                pub->params_nr = DSA_PUBLIC_PARAMS;
 
-               if (pub->params[0] == NULL || pub->params[1] == NULL ||
-                   pub->params[2] == NULL || pub->params[3] == NULL) {
+               if (pub->params[DSA_P] == NULL || pub->params[DSA_Q] == NULL ||
+                   pub->params[DSA_G] == NULL || pub->params[DSA_Y] == NULL) {
+                       gnutls_assert();
+                       ret = GNUTLS_E_MEMORY_ERROR;
+                       goto cleanup;
+               }
+
+               break;
+       case GNUTLS_PK_DH:
+               pub->params[DH_P] = _gnutls_mpi_copy(priv->params[DH_P]);
+               pub->params[DH_G] = _gnutls_mpi_copy(priv->params[DH_G]);
+               pub->params[DH_Y] = _gnutls_mpi_copy(priv->params[DH_Y]);
+
+               if (pub->params[DH_P] == NULL || pub->params[DH_G] == NULL ||
+                   pub->params[DH_Y] == NULL) {
                        gnutls_assert();
                        ret = GNUTLS_E_MEMORY_ERROR;
                        goto cleanup;
                }
 
+               if (priv->params[DH_Q]) {
+                       pub->params[DH_Q] =
+                               _gnutls_mpi_copy(priv->params[DH_Q]);
+                       if (pub->params[DH_Q] == NULL) {
+                               gnutls_assert();
+                               ret = GNUTLS_E_MEMORY_ERROR;
+                               goto cleanup;
+                       }
+               }
+
+               pub->params_nr = DH_PUBLIC_PARAMS;
+
                break;
        case GNUTLS_PK_ECDSA:
                pub->params[ECC_X] = _gnutls_mpi_copy(priv->params[ECC_X]);