evp: convert existing code to use the new modified sentinel for params.
authorPauli <paul.dale@oracle.com>
Wed, 22 Apr 2020 04:20:11 +0000 (14:20 +1000)
committerPauli <paul.dale@oracle.com>
Sat, 25 Apr 2020 08:46:01 +0000 (18:46 +1000)
Reviewed-by: Richard Levitte <levitte@openssl.org>
Reviewed-by: Tomas Mraz <tmraz@fedoraproject.org>
(Merged from https://github.com/openssl/openssl/pull/11601)

crypto/evp/evp_lib.c
crypto/evp/p_lib.c

index d2890d3a2682c0b9903c84db098c7eca46af4441..d5f758fb4f0c772f18651842bd42c6745f46e5e7 100644 (file)
@@ -76,13 +76,15 @@ int EVP_CIPHER_param_to_asn1(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
             goto err;
 
         /* ... but, we should get a return size too! */
-        if (params[0].return_size != 0
+        if (OSSL_PARAM_modified(params)
+            && params[0].return_size != 0
             && (der = OPENSSL_malloc(params[0].return_size)) != NULL) {
             params[0].data = der;
             params[0].data_size = params[0].return_size;
-            params[0].return_size = 0;
+            OSSL_PARAM_set_all_unmodified(params);
             derp = der;
             if (EVP_CIPHER_CTX_get_params(c, params)
+                && OSSL_PARAM_modified(params)
                 && d2i_ASN1_TYPE(&type, (const unsigned char **)&derp,
                                  params[0].return_size) != NULL) {
                 ret = 1;
index fcf369ad5d3f2fa0260d43eb3580ad62357872ea..0b75777a09a7a7330a938040ad05b7d72b27e96c 100644 (file)
@@ -1617,23 +1617,11 @@ const OSSL_PARAM *EVP_PKEY_gettable_params(EVP_PKEY *pkey)
     return evp_keymgmt_gettable_params(pkey->keymgmt);
 }
 
-/*
- * For the following methods param->return_size is set to a value
- * larger than can be returned by the call to evp_keymgmt_get_params().
- * If it is still this value then the parameter was ignored - and in this
- * case it returns an error..
- */
-
 int EVP_PKEY_get_bn_param(EVP_PKEY *pkey, const char *key_name, BIGNUM **bn)
 {
     int ret = 0;
     OSSL_PARAM params[2];
     unsigned char buffer[2048];
-    /*
-     * Use -1 as the terminator here instead of sizeof(buffer) + 1 since
-     * -1 is less likely to be a valid value.
-     */
-    const size_t not_set = (size_t)-1;
     unsigned char *buf = NULL;
     size_t buf_sz = 0;
 
@@ -1646,12 +1634,9 @@ int EVP_PKEY_get_bn_param(EVP_PKEY *pkey, const char *key_name, BIGNUM **bn)
 
     memset(buffer, 0, sizeof(buffer));
     params[0] = OSSL_PARAM_construct_BN(key_name, buffer, sizeof(buffer));
-    /* If the return_size is still not_set then we know it was not found */
-    params[0].return_size = not_set;
     params[1] = OSSL_PARAM_construct_end();
     if (!evp_keymgmt_get_params(pkey->keymgmt, pkey->keydata, params)) {
-        if (params[0].return_size == not_set
-            || params[0].return_size == 0)
+        if (!OSSL_PARAM_modified(params) || params[0].return_size == 0)
             return 0;
         buf_sz = params[0].return_size;
         /*
@@ -1668,7 +1653,7 @@ int EVP_PKEY_get_bn_param(EVP_PKEY *pkey, const char *key_name, BIGNUM **bn)
             goto err;
     }
     /* Fail if the param was not found */
-    if (params[0].return_size == not_set)
+    if (!OSSL_PARAM_modified(params))
         goto err;
     ret = OSSL_PARAM_get_BN(params, bn);
 err:
@@ -1681,7 +1666,6 @@ int EVP_PKEY_get_octet_string_param(EVP_PKEY *pkey, const char *key_name,
                                     size_t *out_sz)
 {
     OSSL_PARAM params[2];
-    const size_t not_set = max_buf_sz + 1;
 
     if (pkey == NULL
         || pkey->keymgmt == NULL
@@ -1690,11 +1674,9 @@ int EVP_PKEY_get_octet_string_param(EVP_PKEY *pkey, const char *key_name,
         return 0;
 
     params[0] = OSSL_PARAM_construct_octet_string(key_name, buf, max_buf_sz);
-    params[0].return_size = not_set;
     params[1] = OSSL_PARAM_construct_end();
-    if (!evp_keymgmt_get_params(pkey->keymgmt, pkey->keydata, params))
-        return 0;
-    if (params[0].return_size == not_set)
+    if (!evp_keymgmt_get_params(pkey->keymgmt, pkey->keydata, params)
+        || !OSSL_PARAM_modified(params))
         return 0;
     if (out_sz != NULL)
         *out_sz = params[0].return_size;
@@ -1706,7 +1688,6 @@ int EVP_PKEY_get_utf8_string_param(EVP_PKEY *pkey, const char *key_name,
                                     size_t *out_sz)
 {
     OSSL_PARAM params[2];
-    const size_t not_set = max_buf_sz + 1;
 
     if (pkey == NULL
         || pkey->keymgmt == NULL
@@ -1715,11 +1696,9 @@ int EVP_PKEY_get_utf8_string_param(EVP_PKEY *pkey, const char *key_name,
         return 0;
 
     params[0] = OSSL_PARAM_construct_utf8_string(key_name, str, max_buf_sz);
-    params[0].return_size = not_set;
     params[1] = OSSL_PARAM_construct_end();
-    if (!evp_keymgmt_get_params(pkey->keymgmt, pkey->keydata, params))
-        return 0;
-    if (params[0].return_size == not_set)
+    if (!evp_keymgmt_get_params(pkey->keymgmt, pkey->keydata, params)
+        || !OSSL_PARAM_modified(params))
         return 0;
     if (out_sz != NULL)
         *out_sz = params[0].return_size;
@@ -1729,7 +1708,6 @@ int EVP_PKEY_get_utf8_string_param(EVP_PKEY *pkey, const char *key_name,
 int EVP_PKEY_get_int_param(EVP_PKEY *pkey, const char *key_name, int *out)
 {
     OSSL_PARAM params[2];
-    const size_t not_set = sizeof(int) + 1;
 
     if (pkey == NULL
         || pkey->keymgmt == NULL
@@ -1738,11 +1716,9 @@ int EVP_PKEY_get_int_param(EVP_PKEY *pkey, const char *key_name, int *out)
         return 0;
 
     params[0] = OSSL_PARAM_construct_int(key_name, out);
-    params[0].return_size = not_set;
     params[1] = OSSL_PARAM_construct_end();
-    if (!evp_keymgmt_get_params(pkey->keymgmt, pkey->keydata, params))
-        return 0;
-    if (params[0].return_size == not_set)
+    if (!evp_keymgmt_get_params(pkey->keymgmt, pkey->keydata, params)
+        || !OSSL_PARAM_modified(params))
         return 0;
     return 1;
 }
@@ -1750,7 +1726,6 @@ int EVP_PKEY_get_int_param(EVP_PKEY *pkey, const char *key_name, int *out)
 int EVP_PKEY_get_size_t_param(EVP_PKEY *pkey, const char *key_name, size_t *out)
 {
     OSSL_PARAM params[2];
-    const size_t not_set = sizeof(size_t) + 1;
 
     if (pkey == NULL
         || pkey->keymgmt == NULL
@@ -1759,11 +1734,9 @@ int EVP_PKEY_get_size_t_param(EVP_PKEY *pkey, const char *key_name, size_t *out)
         return 0;
 
     params[0] = OSSL_PARAM_construct_size_t(key_name, out);
-    params[0].return_size = not_set;
     params[1] = OSSL_PARAM_construct_end();
-    if (!evp_keymgmt_get_params(pkey->keymgmt, pkey->keydata, params))
-        return 0;
-    if (params[0].return_size == not_set)
+    if (!evp_keymgmt_get_params(pkey->keymgmt, pkey->keydata, params)
+        || !OSSL_PARAM_modified(params))
         return 0;
     return 1;
 }