mirror of https://github.com/openssl/openssl.git
				
				
				
			
		
			
				
	
	
		
			120 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
| /*
 | |
|  * Copyright 2023 The OpenSSL Project Authors. All Rights Reserved.
 | |
|  *
 | |
|  * Licensed under the Apache License 2.0 (the "License").  You may not use
 | |
|  * this file except in compliance with the License.  You can obtain a copy
 | |
|  * in the file LICENSE in the source distribution or at
 | |
|  * https://www.openssl.org/source/license.html
 | |
|  */
 | |
| 
 | |
| #include <openssl/pem.h>
 | |
| #include <openssl/evp.h>
 | |
| #include "testutil.h"
 | |
| 
 | |
| static OSSL_LIB_CTX *libctx = NULL;
 | |
| static OSSL_PROVIDER *nullprov = NULL;
 | |
| static OSSL_PROVIDER *libprov = NULL;
 | |
| static const char *filename = NULL;
 | |
| static pem_password_cb passcb;
 | |
| 
 | |
| typedef enum OPTION_choice {
 | |
|     OPT_ERR = -1,
 | |
|     OPT_EOF = 0,
 | |
|     OPT_CONFIG_FILE,
 | |
|     OPT_PROVIDER_NAME,
 | |
|     OPT_TEST_ENUM
 | |
| } OPTION_CHOICE;
 | |
| 
 | |
| const OPTIONS *test_get_options(void)
 | |
| {
 | |
|     static const OPTIONS test_options[] = {
 | |
|         OPT_TEST_OPTIONS_WITH_EXTRA_USAGE("file\n"),
 | |
|         { "config", OPT_CONFIG_FILE, '<',
 | |
|           "The configuration file to use for the libctx" },
 | |
|         { "provider", OPT_PROVIDER_NAME, 's',
 | |
|           "The provider to load (The default value is 'default')" },
 | |
|         { OPT_HELP_STR, 1, '-', "file\tFile to decode.\n" },
 | |
|         { NULL }
 | |
|     };
 | |
|     return test_options;
 | |
| }
 | |
| 
 | |
| static int passcb(char *buf, int size, int rwflag, void *userdata)
 | |
| {
 | |
|     strcpy(buf, "pass");
 | |
|     return strlen(buf);
 | |
| }
 | |
| 
 | |
| static int test_decode_nonfipsalg(void)
 | |
| {
 | |
|     int ret = 0;
 | |
|     EVP_PKEY *privkey = NULL;
 | |
|     BIO *bio = NULL;
 | |
| 
 | |
|     /*
 | |
|      * Apply the "fips=true" property to all fetches for the libctx.
 | |
|      * We do this to test that we are using the propq override
 | |
|      */
 | |
|     EVP_default_properties_enable_fips(libctx, 1);
 | |
| 
 | |
|     if (!TEST_ptr(bio = BIO_new_file(filename, "r")))
 | |
|         goto err;
 | |
| 
 | |
|     /*
 | |
|      * If NULL is passed as the propq here it uses the global property "fips=true",
 | |
|      * Which we expect to fail if the decode uses a non FIPS algorithm
 | |
|      */
 | |
|     if (!TEST_ptr_null(PEM_read_bio_PrivateKey_ex(bio, &privkey, &passcb, NULL, libctx, NULL)))
 | |
|         goto err;
 | |
| 
 | |
|     /*
 | |
|      * Pass if we override the libctx global prop query to optionally use fips=true
 | |
|      * This assumes that the libctx contains the default provider
 | |
|      */
 | |
|     if (!TEST_ptr_null(PEM_read_bio_PrivateKey_ex(bio, &privkey, &passcb, NULL, libctx, "?fips=true")))
 | |
|         goto err;
 | |
| 
 | |
|     ret = 1;
 | |
| err:
 | |
|     BIO_free(bio);
 | |
|     EVP_PKEY_free(privkey);
 | |
|     return ret;
 | |
| }
 | |
| 
 | |
| int setup_tests(void)
 | |
| {
 | |
|     const char *prov_name = "default";
 | |
|     char *config_file = NULL;
 | |
|     OPTION_CHOICE o;
 | |
| 
 | |
|     while ((o = opt_next()) != OPT_EOF) {
 | |
|         switch (o) {
 | |
|         case OPT_PROVIDER_NAME:
 | |
|             prov_name = opt_arg();
 | |
|             break;
 | |
|         case OPT_CONFIG_FILE:
 | |
|             config_file = opt_arg();
 | |
|             break;
 | |
|         case OPT_TEST_CASES:
 | |
|            break;
 | |
|         default:
 | |
|         case OPT_ERR:
 | |
|             return 0;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     filename = test_get_argument(0);
 | |
|     if (!test_get_libctx(&libctx, &nullprov, config_file, &libprov, prov_name))
 | |
|         return 0;
 | |
| 
 | |
|     ADD_TEST(test_decode_nonfipsalg);
 | |
|     return 1;
 | |
| }
 | |
| 
 | |
| void cleanup_tests(void)
 | |
| {
 | |
|     OSSL_PROVIDER_unload(libprov);
 | |
|     OSSL_LIB_CTX_free(libctx);
 | |
|     OSSL_PROVIDER_unload(nullprov);
 | |
| }
 |