@@ -2111,6 +2111,22 @@ static int test_aead_vec(const char *driver, int enc,
21112111}
21122112
21132113#ifdef CONFIG_CRYPTO_MANAGER_EXTRA_TESTS
2114+
2115+ struct aead_extra_tests_ctx {
2116+ struct aead_request * req ;
2117+ struct crypto_aead * tfm ;
2118+ const char * driver ;
2119+ const struct alg_test_desc * test_desc ;
2120+ struct cipher_test_sglists * tsgls ;
2121+ unsigned int maxdatasize ;
2122+ unsigned int maxkeysize ;
2123+
2124+ struct aead_testvec vec ;
2125+ char vec_name [64 ];
2126+ char cfgname [TESTVEC_CONFIG_NAMELEN ];
2127+ struct testvec_config cfg ;
2128+ };
2129+
21142130/*
21152131 * Generate an AEAD test vector from the given implementation.
21162132 * Assumes the buffers in 'vec' were already allocated.
@@ -2123,7 +2139,7 @@ static void generate_random_aead_testvec(struct aead_request *req,
21232139{
21242140 struct crypto_aead * tfm = crypto_aead_reqtfm (req );
21252141 const unsigned int ivsize = crypto_aead_ivsize (tfm );
2126- unsigned int maxauthsize = crypto_aead_alg (tfm )-> maxauthsize ;
2142+ const unsigned int maxauthsize = crypto_aead_maxauthsize (tfm );
21272143 unsigned int authsize ;
21282144 unsigned int total_len ;
21292145 int i ;
@@ -2192,35 +2208,21 @@ static void generate_random_aead_testvec(struct aead_request *req,
21922208}
21932209
21942210/*
2195- * Test the AEAD algorithm represented by @req against the corresponding generic
2196- * implementation, if one is available.
2211+ * Test the AEAD algorithm against the corresponding generic implementation, if
2212+ * one is available.
21972213 */
2198- static int test_aead_vs_generic_impl (const char * driver ,
2199- const struct alg_test_desc * test_desc ,
2200- struct aead_request * req ,
2201- struct cipher_test_sglists * tsgls )
2214+ static int test_aead_vs_generic_impl (struct aead_extra_tests_ctx * ctx )
22022215{
2203- struct crypto_aead * tfm = crypto_aead_reqtfm (req );
2204- const unsigned int ivsize = crypto_aead_ivsize (tfm );
2205- const unsigned int maxauthsize = crypto_aead_alg (tfm )-> maxauthsize ;
2206- const unsigned int blocksize = crypto_aead_blocksize (tfm );
2207- const unsigned int maxdatasize = (2 * PAGE_SIZE ) - TESTMGR_POISON_LEN ;
2216+ struct crypto_aead * tfm = ctx -> tfm ;
22082217 const char * algname = crypto_aead_alg (tfm )-> base .cra_name ;
2209- const char * generic_driver = test_desc -> generic_driver ;
2218+ const char * driver = ctx -> driver ;
2219+ const char * generic_driver = ctx -> test_desc -> generic_driver ;
22102220 char _generic_driver [CRYPTO_MAX_ALG_NAME ];
22112221 struct crypto_aead * generic_tfm = NULL ;
22122222 struct aead_request * generic_req = NULL ;
2213- unsigned int maxkeysize ;
22142223 unsigned int i ;
2215- struct aead_testvec vec = { 0 };
2216- char vec_name [64 ];
2217- struct testvec_config * cfg ;
2218- char cfgname [TESTVEC_CONFIG_NAMELEN ];
22192224 int err ;
22202225
2221- if (noextratests )
2222- return 0 ;
2223-
22242226 if (!generic_driver ) { /* Use default naming convention? */
22252227 err = build_generic_driver_name (algname , _generic_driver );
22262228 if (err )
@@ -2244,12 +2246,6 @@ static int test_aead_vs_generic_impl(const char *driver,
22442246 return err ;
22452247 }
22462248
2247- cfg = kzalloc (sizeof (* cfg ), GFP_KERNEL );
2248- if (!cfg ) {
2249- err = - ENOMEM ;
2250- goto out ;
2251- }
2252-
22532249 generic_req = aead_request_alloc (generic_tfm , GFP_KERNEL );
22542250 if (!generic_req ) {
22552251 err = - ENOMEM ;
@@ -2258,24 +2254,27 @@ static int test_aead_vs_generic_impl(const char *driver,
22582254
22592255 /* Check the algorithm properties for consistency. */
22602256
2261- if (maxauthsize != crypto_aead_alg (generic_tfm )-> maxauthsize ) {
2257+ if (crypto_aead_maxauthsize (tfm ) !=
2258+ crypto_aead_maxauthsize (generic_tfm )) {
22622259 pr_err ("alg: aead: maxauthsize for %s (%u) doesn't match generic impl (%u)\n" ,
2263- driver , maxauthsize ,
2264- crypto_aead_alg (generic_tfm )-> maxauthsize );
2260+ driver , crypto_aead_maxauthsize ( tfm ) ,
2261+ crypto_aead_maxauthsize (generic_tfm ));
22652262 err = - EINVAL ;
22662263 goto out ;
22672264 }
22682265
2269- if (ivsize != crypto_aead_ivsize (generic_tfm )) {
2266+ if (crypto_aead_ivsize ( tfm ) != crypto_aead_ivsize (generic_tfm )) {
22702267 pr_err ("alg: aead: ivsize for %s (%u) doesn't match generic impl (%u)\n" ,
2271- driver , ivsize , crypto_aead_ivsize (generic_tfm ));
2268+ driver , crypto_aead_ivsize (tfm ),
2269+ crypto_aead_ivsize (generic_tfm ));
22722270 err = - EINVAL ;
22732271 goto out ;
22742272 }
22752273
2276- if (blocksize != crypto_aead_blocksize (generic_tfm )) {
2274+ if (crypto_aead_blocksize ( tfm ) != crypto_aead_blocksize (generic_tfm )) {
22772275 pr_err ("alg: aead: blocksize for %s (%u) doesn't match generic impl (%u)\n" ,
2278- driver , blocksize , crypto_aead_blocksize (generic_tfm ));
2276+ driver , crypto_aead_blocksize (tfm ),
2277+ crypto_aead_blocksize (generic_tfm ));
22792278 err = - EINVAL ;
22802279 goto out ;
22812280 }
@@ -2284,57 +2283,86 @@ static int test_aead_vs_generic_impl(const char *driver,
22842283 * Now generate test vectors using the generic implementation, and test
22852284 * the other implementation against them.
22862285 */
2287-
2288- maxkeysize = 0 ;
2289- for (i = 0 ; i < test_desc -> suite .aead .count ; i ++ )
2290- maxkeysize = max_t (unsigned int , maxkeysize ,
2291- test_desc -> suite .aead .vecs [i ].klen );
2292-
2293- vec .key = kmalloc (maxkeysize , GFP_KERNEL );
2294- vec .iv = kmalloc (ivsize , GFP_KERNEL );
2295- vec .assoc = kmalloc (maxdatasize , GFP_KERNEL );
2296- vec .ptext = kmalloc (maxdatasize , GFP_KERNEL );
2297- vec .ctext = kmalloc (maxdatasize , GFP_KERNEL );
2298- if (!vec .key || !vec .iv || !vec .assoc || !vec .ptext || !vec .ctext ) {
2299- err = - ENOMEM ;
2300- goto out ;
2301- }
2302-
23032286 for (i = 0 ; i < fuzz_iterations * 8 ; i ++ ) {
2304- generate_random_aead_testvec (generic_req , & vec ,
2305- maxkeysize , maxdatasize ,
2306- vec_name , sizeof (vec_name ));
2307- generate_random_testvec_config (cfg , cfgname , sizeof (cfgname ));
2308-
2309- err = test_aead_vec_cfg (driver , ENCRYPT , & vec , vec_name , cfg ,
2310- req , tsgls );
2287+ generate_random_aead_testvec (generic_req , & ctx -> vec ,
2288+ ctx -> maxkeysize , ctx -> maxdatasize ,
2289+ ctx -> vec_name ,
2290+ sizeof (ctx -> vec_name ));
2291+ generate_random_testvec_config (& ctx -> cfg , ctx -> cfgname ,
2292+ sizeof (ctx -> cfgname ));
2293+ err = test_aead_vec_cfg (driver , ENCRYPT , & ctx -> vec ,
2294+ ctx -> vec_name , & ctx -> cfg ,
2295+ ctx -> req , ctx -> tsgls );
23112296 if (err )
23122297 goto out ;
2313- if (vec .crypt_error == 0 ) {
2314- err = test_aead_vec_cfg (driver , DECRYPT , & vec , vec_name ,
2315- cfg , req , tsgls );
2298+ if (ctx -> vec .crypt_error == 0 ) {
2299+ err = test_aead_vec_cfg (driver , DECRYPT , & ctx -> vec ,
2300+ ctx -> vec_name , & ctx -> cfg ,
2301+ ctx -> req , ctx -> tsgls );
23162302 if (err )
23172303 goto out ;
23182304 }
23192305 cond_resched ();
23202306 }
23212307 err = 0 ;
23222308out :
2323- kfree (cfg );
2324- kfree (vec .key );
2325- kfree (vec .iv );
2326- kfree (vec .assoc );
2327- kfree (vec .ptext );
2328- kfree (vec .ctext );
23292309 crypto_free_aead (generic_tfm );
23302310 aead_request_free (generic_req );
23312311 return err ;
23322312}
2313+
2314+ static int test_aead_extra (const char * driver ,
2315+ const struct alg_test_desc * test_desc ,
2316+ struct aead_request * req ,
2317+ struct cipher_test_sglists * tsgls )
2318+ {
2319+ struct aead_extra_tests_ctx * ctx ;
2320+ unsigned int i ;
2321+ int err ;
2322+
2323+ if (noextratests )
2324+ return 0 ;
2325+
2326+ ctx = kzalloc (sizeof (* ctx ), GFP_KERNEL );
2327+ if (!ctx )
2328+ return - ENOMEM ;
2329+ ctx -> req = req ;
2330+ ctx -> tfm = crypto_aead_reqtfm (req );
2331+ ctx -> driver = driver ;
2332+ ctx -> test_desc = test_desc ;
2333+ ctx -> tsgls = tsgls ;
2334+ ctx -> maxdatasize = (2 * PAGE_SIZE ) - TESTMGR_POISON_LEN ;
2335+ ctx -> maxkeysize = 0 ;
2336+ for (i = 0 ; i < test_desc -> suite .aead .count ; i ++ )
2337+ ctx -> maxkeysize = max_t (unsigned int , ctx -> maxkeysize ,
2338+ test_desc -> suite .aead .vecs [i ].klen );
2339+
2340+ ctx -> vec .key = kmalloc (ctx -> maxkeysize , GFP_KERNEL );
2341+ ctx -> vec .iv = kmalloc (crypto_aead_ivsize (ctx -> tfm ), GFP_KERNEL );
2342+ ctx -> vec .assoc = kmalloc (ctx -> maxdatasize , GFP_KERNEL );
2343+ ctx -> vec .ptext = kmalloc (ctx -> maxdatasize , GFP_KERNEL );
2344+ ctx -> vec .ctext = kmalloc (ctx -> maxdatasize , GFP_KERNEL );
2345+ if (!ctx -> vec .key || !ctx -> vec .iv || !ctx -> vec .assoc ||
2346+ !ctx -> vec .ptext || !ctx -> vec .ctext ) {
2347+ err = - ENOMEM ;
2348+ goto out ;
2349+ }
2350+
2351+ err = test_aead_vs_generic_impl (ctx );
2352+ out :
2353+ kfree (ctx -> vec .key );
2354+ kfree (ctx -> vec .iv );
2355+ kfree (ctx -> vec .assoc );
2356+ kfree (ctx -> vec .ptext );
2357+ kfree (ctx -> vec .ctext );
2358+ kfree (ctx );
2359+ return err ;
2360+ }
23332361#else /* !CONFIG_CRYPTO_MANAGER_EXTRA_TESTS */
2334- static int test_aead_vs_generic_impl (const char * driver ,
2335- const struct alg_test_desc * test_desc ,
2336- struct aead_request * req ,
2337- struct cipher_test_sglists * tsgls )
2362+ static int test_aead_extra (const char * driver ,
2363+ const struct alg_test_desc * test_desc ,
2364+ struct aead_request * req ,
2365+ struct cipher_test_sglists * tsgls )
23382366{
23392367 return 0 ;
23402368}
@@ -2403,7 +2431,7 @@ static int alg_test_aead(const struct alg_test_desc *desc, const char *driver,
24032431 if (err )
24042432 goto out ;
24052433
2406- err = test_aead_vs_generic_impl (driver , desc , req , tsgls );
2434+ err = test_aead_extra (driver , desc , req , tsgls );
24072435out :
24082436 free_cipher_test_sglists (tsgls );
24092437 aead_request_free (req );
0 commit comments