Skip to content

Commit e66effa

Browse files
naynajainmpe
authored andcommitted
security/integrity: fix pointer to ESL data and its size on pseries
On PowerVM guest, variable data is prefixed with 8 bytes of timestamp. Extract ESL by stripping off the timestamp before passing to ESL parser. Fixes: 4b3e71e ("integrity/powerpc: Support loading keys from PLPKS") Cc: stable@vger.kenrnel.org # v6.3 Signed-off-by: Nayna Jain <nayna@linux.ibm.com> Tested-by: Nageswara R Sastry <rnsastry@linux.ibm.com> Acked-by: Jarkko Sakkinen <jarkko@kernel.org> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://msgid.link/20230608120444.382527-1-nayna@linux.ibm.com
1 parent c8eebc4 commit e66effa

1 file changed

Lines changed: 26 additions & 14 deletions

File tree

security/integrity/platform_certs/load_powerpc.c

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
#include "keyring_handler.h"
1616
#include "../integrity.h"
1717

18+
#define extract_esl(db, data, size, offset) \
19+
do { db = data + offset; size = size - offset; } while (0)
20+
1821
/*
1922
* Get a certificate list blob from the named secure variable.
2023
*
@@ -55,8 +58,9 @@ static __init void *get_cert_list(u8 *key, unsigned long keylen, u64 *size)
5558
*/
5659
static int __init load_powerpc_certs(void)
5760
{
58-
void *db = NULL, *dbx = NULL;
59-
u64 dbsize = 0, dbxsize = 0;
61+
void *db = NULL, *dbx = NULL, *data = NULL;
62+
u64 dsize = 0;
63+
u64 offset = 0;
6064
int rc = 0;
6165
ssize_t len;
6266
char buf[32];
@@ -74,38 +78,46 @@ static int __init load_powerpc_certs(void)
7478
return -ENODEV;
7579
}
7680

81+
if (strcmp("ibm,plpks-sb-v1", buf) == 0)
82+
/* PLPKS authenticated variables ESL data is prefixed with 8 bytes of timestamp */
83+
offset = 8;
84+
7785
/*
7886
* Get db, and dbx. They might not exist, so it isn't an error if we
7987
* can't get them.
8088
*/
81-
db = get_cert_list("db", 3, &dbsize);
82-
if (!db) {
89+
data = get_cert_list("db", 3, &dsize);
90+
if (!data) {
8391
pr_info("Couldn't get db list from firmware\n");
84-
} else if (IS_ERR(db)) {
85-
rc = PTR_ERR(db);
92+
} else if (IS_ERR(data)) {
93+
rc = PTR_ERR(data);
8694
pr_err("Error reading db from firmware: %d\n", rc);
8795
return rc;
8896
} else {
89-
rc = parse_efi_signature_list("powerpc:db", db, dbsize,
97+
extract_esl(db, data, dsize, offset);
98+
99+
rc = parse_efi_signature_list("powerpc:db", db, dsize,
90100
get_handler_for_db);
91101
if (rc)
92102
pr_err("Couldn't parse db signatures: %d\n", rc);
93-
kfree(db);
103+
kfree(data);
94104
}
95105

96-
dbx = get_cert_list("dbx", 4, &dbxsize);
97-
if (!dbx) {
106+
data = get_cert_list("dbx", 4, &dsize);
107+
if (!data) {
98108
pr_info("Couldn't get dbx list from firmware\n");
99-
} else if (IS_ERR(dbx)) {
100-
rc = PTR_ERR(dbx);
109+
} else if (IS_ERR(data)) {
110+
rc = PTR_ERR(data);
101111
pr_err("Error reading dbx from firmware: %d\n", rc);
102112
return rc;
103113
} else {
104-
rc = parse_efi_signature_list("powerpc:dbx", dbx, dbxsize,
114+
extract_esl(dbx, data, dsize, offset);
115+
116+
rc = parse_efi_signature_list("powerpc:dbx", dbx, dsize,
105117
get_handler_for_dbx);
106118
if (rc)
107119
pr_err("Couldn't parse dbx signatures: %d\n", rc);
108-
kfree(dbx);
120+
kfree(data);
109121
}
110122

111123
return rc;

0 commit comments

Comments
 (0)