diff --git a/zkey/keystore.c b/zkey/keystore.c index db62e0a6..4f795a28 100644 --- a/zkey/keystore.c +++ b/zkey/keystore.c @@ -3567,6 +3567,15 @@ static int _keystore_process_reencipher(struct keystore *keystore, goto out; } + if (!is_secure_key(secure_key, secure_key_size)) { + warnx("Key '%s' is of type %s and can not be re-enciphered, " + "skipping", name, get_key_type(secure_key, + secure_key_size)); + info->num_skipped++; + rc = 0; + goto out; + } + apqns = properties_get(properties, PROP_NAME_APQNS); if (apqns != NULL) apqn_list = str_list_split(apqns); diff --git a/zkey/zkey-cryptsetup.1 b/zkey/zkey-cryptsetup.1 index c455f845..185edab9 100644 --- a/zkey/zkey-cryptsetup.1 +++ b/zkey/zkey-cryptsetup.1 @@ -1,8 +1,8 @@ -.\" Copyright IBM Corp. 2018 +.\" Copyright IBM Corp. 2018, 2024 .\" s390-tools is free software; you can redistribute it and/or modify .\" it under the terms of the MIT license. See LICENSE for details. .\" -.TH ZKEY\-CRYPTSETUP 1 "May 2018" "s390-tools" +.TH ZKEY\-CRYPTSETUP 1 "February 2024" "s390-tools" .SH NAME zkey\-cryptsetup \- Manage secure AES volume keys of volumes encrypted with \fBLUKS2\fP and the \fBpaes\fP cipher @@ -115,6 +115,10 @@ command to re-encipher a secure AES volume key of a volume encrypted with re-enciphered when the master key of the cryptographic adapter in CCA or EP11 coprocessor mode changes. .PP +Volume keys of type \fBPVSECRET\-AES\fP can not be re-enciphered. These keys do +not use a cryptographic adapter, thus they do not need to be re-enciphered when +the master key of a cryptographic adapter changes. +.PP The cryptographic adapter in CCA coprocessor mode has three different registers to store master keys: .RS 2 diff --git a/zkey/zkey-cryptsetup.c b/zkey/zkey-cryptsetup.c index 8b55f7d1..2b018a2a 100644 --- a/zkey/zkey-cryptsetup.c +++ b/zkey/zkey-cryptsetup.c @@ -2,7 +2,7 @@ * zkey-cryptsetup - Re-encipher or validate volume keys of volumes * encrypted with LUKS2 and the paes cipher. * - * Copyright IBM Corp. 2018 + * Copyright IBM Corp. 2018, 2024 * * s390-tools is free software; you can redistribute it and/or modify * it under the terms of the MIT license. See LICENSE for details. @@ -82,7 +82,7 @@ static const struct util_prg prg = { { .owner = "IBM Corp.", .pub_first = 2018, - .pub_last = 2018, + .pub_last = 2024, }, UTIL_PRG_COPYRIGHT_END } @@ -1609,14 +1609,22 @@ static int reencipher_prepare(int token) if (rc < 0) goto out; + securekeysize = keysize - integrity_keysize; + + if (!is_secure_key((u8 *)key, securekeysize)) { + warnx("The volume key of device '%s' is of type %s and can " + "not be re-enciphered", g.pos_arg, + get_key_type((u8 *)key, securekeysize)); + rc = -EINVAL; + goto out; + } + reenc_tok.original_keyslot = rc; rc = ensure_is_active_keylot(reenc_tok.original_keyslot); if (rc != 0) goto out; - securekeysize = keysize - integrity_keysize; - rc = generate_key_verification_pattern((u8 *)key, securekeysize, reenc_tok.verification_pattern, sizeof(reenc_tok.verification_pattern), diff --git a/zkey/zkey.1 b/zkey/zkey.1 index baaf8478..316db5f0 100644 --- a/zkey/zkey.1 +++ b/zkey/zkey.1 @@ -266,6 +266,10 @@ command to re-encipher an existing secure key with a new master key. A secure key must be re-enciphered when the master key of the CCA or EP11 cryptographic adapter changes. .PP +Keys of type \fBPVSECRET\-AES\fP can not be re-enciphered. These keys do not +use a cryptographic adapter, thus they do not need to be re-enciphered when the +master of a cryptographic adapter changes. +.PP The CCA cryptographic adapter has three different registers to store master keys: .RS 2 diff --git a/zkey/zkey.c b/zkey/zkey.c index 36bdbcc0..90b46106 100644 --- a/zkey/zkey.c +++ b/zkey/zkey.c @@ -2118,6 +2118,13 @@ static int command_reencipher_file(void) if (secure_key == NULL) return EXIT_FAILURE; + if (!is_secure_key(secure_key, secure_key_size)) { + warnx("A key of type %s can not be re-enciphered", + get_key_type(secure_key, secure_key_size)); + rc = EXIT_FAILURE; + goto out; + } + rc = validate_secure_key(g.pkey_fd, secure_key, secure_key_size, NULL, &is_old_mk, NULL, g.verbose); if (rc != 0) {