selftest.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /* Self-testing for signature checking.
  3. *
  4. * Copyright (C) 2022 Red Hat, Inc. All Rights Reserved.
  5. * Written by David Howells (dhowells@redhat.com)
  6. */
  7. #include <crypto/pkcs7.h>
  8. #include <linux/cred.h>
  9. #include <linux/kernel.h>
  10. #include <linux/key.h>
  11. #include <linux/module.h>
  12. #include "selftest.h"
  13. #include "x509_parser.h"
  14. void fips_signature_selftest(const char *name,
  15. const u8 *keys, size_t keys_len,
  16. const u8 *data, size_t data_len,
  17. const u8 *sig, size_t sig_len)
  18. {
  19. struct key *keyring;
  20. int ret;
  21. pr_notice("Running certificate verification %s selftest\n", name);
  22. keyring = keyring_alloc(".certs_selftest",
  23. GLOBAL_ROOT_UID, GLOBAL_ROOT_GID, current_cred(),
  24. (KEY_POS_ALL & ~KEY_POS_SETATTR) |
  25. KEY_USR_VIEW | KEY_USR_READ |
  26. KEY_USR_SEARCH,
  27. KEY_ALLOC_NOT_IN_QUOTA,
  28. NULL, NULL);
  29. if (IS_ERR(keyring))
  30. panic("Can't allocate certs %s selftest keyring: %ld\n", name, PTR_ERR(keyring));
  31. ret = x509_load_certificate_list(keys, keys_len, keyring);
  32. if (ret < 0)
  33. panic("Can't allocate certs %s selftest keyring: %d\n", name, ret);
  34. struct pkcs7_message *pkcs7;
  35. pkcs7 = pkcs7_parse_message(sig, sig_len);
  36. if (IS_ERR(pkcs7))
  37. panic("Certs %s selftest: pkcs7_parse_message() = %d\n", name, ret);
  38. pkcs7_supply_detached_data(pkcs7, data, data_len);
  39. ret = pkcs7_verify(pkcs7, VERIFYING_MODULE_SIGNATURE);
  40. if (ret < 0)
  41. panic("Certs %s selftest: pkcs7_verify() = %d\n", name, ret);
  42. ret = pkcs7_validate_trust(pkcs7, keyring);
  43. if (ret < 0)
  44. panic("Certs %s selftest: pkcs7_validate_trust() = %d\n", name, ret);
  45. pkcs7_free_message(pkcs7);
  46. key_put(keyring);
  47. }
  48. static int __init fips_signature_selftest_init(void)
  49. {
  50. fips_signature_selftest_rsa();
  51. fips_signature_selftest_ecdsa();
  52. return 0;
  53. }
  54. late_initcall(fips_signature_selftest_init);
  55. MODULE_DESCRIPTION("X.509 self tests");
  56. MODULE_AUTHOR("Red Hat, Inc.");
  57. MODULE_LICENSE("GPL");