Make EVP_PKEY_CTX_[get|set]_group_name work for DH too
[openssl.git] / crypto / evp / pmeth_check.c
index 19f200a3ce1de72e4789bdbb1a7cf4664625130e..b99d5b1abdac1f6cfe9ab2197718a397492687a4 100644 (file)
@@ -28,25 +28,31 @@ int EVP_PKEY_public_check(EVP_PKEY_CTX *ctx)
         return 0;
     }
 
-    keymgmt = pkey->pkeys[0].keymgmt;
-    key = pkey->pkeys[0].provdata;
+    keymgmt = pkey->keymgmt;
+    key = pkey->keydata;
 
     if (key != NULL && keymgmt != NULL)
-        return evp_keymgmt_validate_public(keymgmt, key);
+        return evp_keymgmt_validate(keymgmt, key,
+                                    OSSL_KEYMGMT_SELECT_PUBLIC_KEY);
 
+    if (pkey->type == EVP_PKEY_NONE)
+        goto not_supported;
+
+#ifndef FIPS_MODULE
     /* legacy */
     /* call customized public key check function first */
     if (ctx->pmeth->public_check != NULL)
         return ctx->pmeth->public_check(pkey);
 
     /* use default public key check function in ameth */
-    if (pkey->ameth == NULL || pkey->ameth->pkey_public_check == NULL) {
-        EVPerr(EVP_F_EVP_PKEY_PUBLIC_CHECK,
-               EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
-        return -2;
-    }
+    if (pkey->ameth == NULL || pkey->ameth->pkey_public_check == NULL)
+        goto not_supported;
 
     return pkey->ameth->pkey_public_check(pkey);
+#endif
+ not_supported:
+    EVPerr(0, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
+    return -2;
 }
 
 int EVP_PKEY_param_check(EVP_PKEY_CTX *ctx)
@@ -60,25 +66,31 @@ int EVP_PKEY_param_check(EVP_PKEY_CTX *ctx)
         return 0;
     }
 
-    keymgmt = pkey->pkeys[0].keymgmt;
-    key = pkey->pkeys[0].provdata;
+    keymgmt = pkey->keymgmt;
+    key = pkey->keydata;
 
     if (key != NULL && keymgmt != NULL)
-        return evp_keymgmt_validate_domparams(keymgmt, key);
+        return evp_keymgmt_validate(keymgmt, key,
+                                    OSSL_KEYMGMT_SELECT_ALL_PARAMETERS);
+
+    if (pkey->type == EVP_PKEY_NONE)
+        goto not_supported;
 
+#ifndef FIPS_MODULE
+    /* legacy */
     /* call customized param check function first */
     if (ctx->pmeth->param_check != NULL)
         return ctx->pmeth->param_check(pkey);
 
-    /* legacy */
     /* use default param check function in ameth */
-    if (pkey->ameth == NULL || pkey->ameth->pkey_param_check == NULL) {
-        EVPerr(EVP_F_EVP_PKEY_PARAM_CHECK,
-               EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
-        return -2;
-    }
+    if (pkey->ameth == NULL || pkey->ameth->pkey_param_check == NULL)
+        goto not_supported;
 
     return pkey->ameth->pkey_param_check(pkey);
+#endif
+ not_supported:
+    EVPerr(0, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
+    return -2;
 }
 
 int EVP_PKEY_private_check(EVP_PKEY_CTX *ctx)
@@ -92,12 +104,14 @@ int EVP_PKEY_private_check(EVP_PKEY_CTX *ctx)
         return 0;
     }
 
-    keymgmt = pkey->pkeys[0].keymgmt;
-    key = pkey->pkeys[0].provdata;
+    keymgmt = pkey->keymgmt;
+    key = pkey->keydata;
 
     if (key != NULL && keymgmt != NULL)
-        return evp_keymgmt_validate_private(keymgmt, key);
+        return evp_keymgmt_validate(keymgmt, key,
+                                    OSSL_KEYMGMT_SELECT_PRIVATE_KEY);
     /* not supported for legacy keys */
+    EVPerr(0, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
     return -2;
 }
 
@@ -112,12 +126,13 @@ int EVP_PKEY_pairwise_check(EVP_PKEY_CTX *ctx)
         return 0;
     }
 
-    keymgmt = pkey->pkeys[0].keymgmt;
-    key = pkey->pkeys[0].provdata;
+    keymgmt = pkey->keymgmt;
+    key = pkey->keydata;
 
     if (key != NULL && keymgmt != NULL)
-        return evp_keymgmt_validate_pairwise(keymgmt, key);
+        return evp_keymgmt_validate(keymgmt, key, OSSL_KEYMGMT_SELECT_KEYPAIR);
     /* not supported for legacy keys */
+    EVPerr(0, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
     return -2;
 }
 
@@ -132,27 +147,29 @@ int EVP_PKEY_check(EVP_PKEY_CTX *ctx)
         return 0;
     }
 
-    keymgmt = pkey->pkeys[0].keymgmt;
-    key = pkey->pkeys[0].provdata;
+    keymgmt = pkey->keymgmt;
+    key = pkey->keydata;
 
-    if (key != NULL && keymgmt != NULL) {
-        return evp_keymgmt_validate_domparams(keymgmt, key)
-               && evp_keymgmt_validate_public(keymgmt, key)
-               && evp_keymgmt_validate_private(keymgmt, key)
-               && evp_keymgmt_validate_pairwise(keymgmt, key);
-    }
+    if (key != NULL && keymgmt != NULL)
+        return evp_keymgmt_validate(keymgmt, key, OSSL_KEYMGMT_SELECT_ALL);
+
+    if (pkey->type == EVP_PKEY_NONE)
+        goto not_supported;
+
+#ifndef FIPS_MODULE
     /* legacy */
     /* call customized check function first */
     if (ctx->pmeth->check != NULL)
         return ctx->pmeth->check(pkey);
 
     /* use default check function in ameth */
-    if (pkey->ameth == NULL || pkey->ameth->pkey_check == NULL) {
-        EVPerr(EVP_F_EVP_PKEY_CHECK,
-               EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
-        return -2;
-    }
+    if (pkey->ameth == NULL || pkey->ameth->pkey_check == NULL)
+        goto not_supported;
 
     return pkey->ameth->pkey_check(pkey);
+#endif
+ not_supported:
+    EVPerr(0, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
+    return -2;
 }