|
34 | 34 | #define IMA_EUID 0x0080
|
35 | 35 | #define IMA_PCR 0x0100
|
36 | 36 | #define IMA_FSNAME 0x0200
|
| 37 | +#define IMA_KEYRINGS 0x0400 |
37 | 38 |
|
38 | 39 | #define UNKNOWN 0
|
39 | 40 | #define MEASURE 0x0001 /* same as IMA_MEASURE */
|
@@ -820,7 +821,8 @@ enum {
|
820 | 821 | Opt_uid_gt, Opt_euid_gt, Opt_fowner_gt,
|
821 | 822 | Opt_uid_lt, Opt_euid_lt, Opt_fowner_lt,
|
822 | 823 | Opt_appraise_type, Opt_appraise_flag,
|
823 |
| - Opt_permit_directio, Opt_pcr, Opt_template, Opt_err |
| 824 | + Opt_permit_directio, Opt_pcr, Opt_template, Opt_keyrings, |
| 825 | + Opt_err |
824 | 826 | };
|
825 | 827 |
|
826 | 828 | static const match_table_t policy_tokens = {
|
@@ -856,6 +858,7 @@ static const match_table_t policy_tokens = {
|
856 | 858 | {Opt_permit_directio, "permit_directio"},
|
857 | 859 | {Opt_pcr, "pcr=%s"},
|
858 | 860 | {Opt_template, "template=%s"},
|
| 861 | + {Opt_keyrings, "keyrings=%s"}, |
859 | 862 | {Opt_err, NULL}
|
860 | 863 | };
|
861 | 864 |
|
@@ -1105,6 +1108,23 @@ static int ima_parse_rule(char *rule, struct ima_rule_entry *entry)
|
1105 | 1108 | result = 0;
|
1106 | 1109 | entry->flags |= IMA_FSNAME;
|
1107 | 1110 | break;
|
| 1111 | + case Opt_keyrings: |
| 1112 | + ima_log_string(ab, "keyrings", args[0].from); |
| 1113 | + |
| 1114 | + if ((entry->keyrings) || |
| 1115 | + (entry->action != MEASURE) || |
| 1116 | + (entry->func != KEY_CHECK)) { |
| 1117 | + result = -EINVAL; |
| 1118 | + break; |
| 1119 | + } |
| 1120 | + entry->keyrings = kstrdup(args[0].from, GFP_KERNEL); |
| 1121 | + if (!entry->keyrings) { |
| 1122 | + result = -ENOMEM; |
| 1123 | + break; |
| 1124 | + } |
| 1125 | + result = 0; |
| 1126 | + entry->flags |= IMA_KEYRINGS; |
| 1127 | + break; |
1108 | 1128 | case Opt_fsuuid:
|
1109 | 1129 | ima_log_string(ab, "fsuuid", args[0].from);
|
1110 | 1130 |
|
@@ -1480,6 +1500,13 @@ int ima_policy_show(struct seq_file *m, void *v)
|
1480 | 1500 | seq_puts(m, " ");
|
1481 | 1501 | }
|
1482 | 1502 |
|
| 1503 | + if (entry->flags & IMA_KEYRINGS) { |
| 1504 | + if (entry->keyrings != NULL) |
| 1505 | + snprintf(tbuf, sizeof(tbuf), "%s", entry->keyrings); |
| 1506 | + seq_printf(m, pt(Opt_keyrings), tbuf); |
| 1507 | + seq_puts(m, " "); |
| 1508 | + } |
| 1509 | + |
1483 | 1510 | if (entry->flags & IMA_PCR) {
|
1484 | 1511 | snprintf(tbuf, sizeof(tbuf), "%d", entry->pcr);
|
1485 | 1512 | seq_printf(m, pt(Opt_pcr), tbuf);
|
|
0 commit comments