@@ -190,6 +190,18 @@ static int pkcs7_verify_sig_chain(struct pkcs7_message *pkcs7,
190
190
x509 -> subject ,
191
191
x509 -> raw_serial_size , x509 -> raw_serial );
192
192
x509 -> seen = true;
193
+
194
+ if (x509 -> blacklisted ) {
195
+ /* If this cert is blacklisted, then mark everything
196
+ * that depends on this as blacklisted too.
197
+ */
198
+ sinfo -> blacklisted = true;
199
+ for (p = sinfo -> signer ; p != x509 ; p = p -> signer )
200
+ p -> blacklisted = true;
201
+ pr_debug ("- blacklisted\n" );
202
+ return 0 ;
203
+ }
204
+
193
205
if (x509 -> unsupported_key )
194
206
goto unsupported_crypto_in_x509 ;
195
207
@@ -357,17 +369,19 @@ static int pkcs7_verify_one(struct pkcs7_message *pkcs7,
357
369
*
358
370
* (*) -EBADMSG if some part of the message was invalid, or:
359
371
*
360
- * (*) -ENOPKG if none of the signature chains are verifiable because suitable
361
- * crypto modules couldn't be found , or:
372
+ * (*) 0 if no signature chains were found to be blacklisted or to contain
373
+ * unsupported crypto , or:
362
374
*
363
- * (*) 0 if all the signature chains that don't incur -ENOPKG can be verified
364
- * (note that a signature chain may be of zero length), or:
375
+ * (*) -EKEYREJECTED if a blacklisted key was encountered, or:
376
+ *
377
+ * (*) -ENOPKG if none of the signature chains are verifiable because suitable
378
+ * crypto modules couldn't be found.
365
379
*/
366
380
int pkcs7_verify (struct pkcs7_message * pkcs7 ,
367
381
enum key_being_used_for usage )
368
382
{
369
383
struct pkcs7_signed_info * sinfo ;
370
- int enopkg = - ENOPKG ;
384
+ int actual_ret = - ENOPKG ;
371
385
int ret ;
372
386
373
387
kenter ("" );
@@ -412,6 +426,8 @@ int pkcs7_verify(struct pkcs7_message *pkcs7,
412
426
413
427
for (sinfo = pkcs7 -> signed_infos ; sinfo ; sinfo = sinfo -> next ) {
414
428
ret = pkcs7_verify_one (pkcs7 , sinfo );
429
+ if (sinfo -> blacklisted && actual_ret == - ENOPKG )
430
+ actual_ret = - EKEYREJECTED ;
415
431
if (ret < 0 ) {
416
432
if (ret == - ENOPKG ) {
417
433
sinfo -> unsupported_crypto = true;
@@ -420,11 +436,11 @@ int pkcs7_verify(struct pkcs7_message *pkcs7,
420
436
kleave (" = %d" , ret );
421
437
return ret ;
422
438
}
423
- enopkg = 0 ;
439
+ actual_ret = 0 ;
424
440
}
425
441
426
- kleave (" = %d" , enopkg );
427
- return enopkg ;
442
+ kleave (" = %d" , actual_ret );
443
+ return actual_ret ;
428
444
}
429
445
EXPORT_SYMBOL_GPL (pkcs7_verify );
430
446
0 commit comments