|
10 | 10 | */ |
11 | 11 |
|
12 | 12 | #include "ima_template_lib.h" |
| 13 | +#include <linux/xattr.h> |
13 | 14 |
|
14 | 15 | static bool ima_template_hash_algo_allowed(u8 algo) |
15 | 16 | { |
@@ -438,7 +439,7 @@ int ima_eventsig_init(struct ima_event_data *event_data, |
438 | 439 | struct evm_ima_xattr_data *xattr_value = event_data->xattr_value; |
439 | 440 |
|
440 | 441 | if ((!xattr_value) || (xattr_value->type != EVM_IMA_XATTR_DIGSIG)) |
441 | | - return 0; |
| 442 | + return ima_eventevmsig_init(event_data, field_data); |
442 | 443 |
|
443 | 444 | return ima_write_template_field_data(xattr_value, event_data->xattr_len, |
444 | 445 | DATA_FMT_HEX, field_data); |
@@ -484,3 +485,33 @@ int ima_eventmodsig_init(struct ima_event_data *event_data, |
484 | 485 | return ima_write_template_field_data(data, data_len, DATA_FMT_HEX, |
485 | 486 | field_data); |
486 | 487 | } |
| 488 | + |
| 489 | +/* |
| 490 | + * ima_eventevmsig_init - include the EVM portable signature as part of the |
| 491 | + * template data |
| 492 | + */ |
| 493 | +int ima_eventevmsig_init(struct ima_event_data *event_data, |
| 494 | + struct ima_field_data *field_data) |
| 495 | +{ |
| 496 | + struct evm_ima_xattr_data *xattr_data = NULL; |
| 497 | + int rc = 0; |
| 498 | + |
| 499 | + if (!event_data->file) |
| 500 | + return 0; |
| 501 | + |
| 502 | + rc = vfs_getxattr_alloc(&init_user_ns, file_dentry(event_data->file), |
| 503 | + XATTR_NAME_EVM, (char **)&xattr_data, 0, |
| 504 | + GFP_NOFS); |
| 505 | + if (rc <= 0) |
| 506 | + return 0; |
| 507 | + |
| 508 | + if (xattr_data->type != EVM_XATTR_PORTABLE_DIGSIG) { |
| 509 | + kfree(xattr_data); |
| 510 | + return 0; |
| 511 | + } |
| 512 | + |
| 513 | + rc = ima_write_template_field_data((char *)xattr_data, rc, DATA_FMT_HEX, |
| 514 | + field_data); |
| 515 | + kfree(xattr_data); |
| 516 | + return rc; |
| 517 | +} |
0 commit comments