1
0
mirror of https://git.code.sf.net/p/linux-ima/ima-evm-utils synced 2025-07-01 13:21:12 +02:00

Read keyid from the cert appended to the key file

Allow to have certificate appended to the private key of `--key'
specified (PEM) file (for v2 signing) to facilitate reading of keyid
from the associated cert. This will allow users to have private and
public key as a single file and avoid the need of manually specifying
keyid. There is no check that public key form the cert matches
associated private key.

Signed-off-by: Vitaly Chikunov <vt@altlinux.org>
Signed-off-by: Mimi Zohar <zohar@linux.ibm.com>
This commit is contained in:
Vitaly Chikunov
2021-07-16 18:16:02 +03:00
committed by Mimi Zohar
parent 0e7a00e26b
commit 40621b2259
4 changed files with 35 additions and 8 deletions

3
README
View File

@ -128,6 +128,9 @@ for signing and importing the key.
Second key format uses X509 DER encoded public key certificates and uses asymmetric key support Second key format uses X509 DER encoded public key certificates and uses asymmetric key support
in the kernel (since kernel 3.9). CONFIG_INTEGRITY_ASYMMETRIC_KEYS must be enabled (default). in the kernel (since kernel 3.9). CONFIG_INTEGRITY_ASYMMETRIC_KEYS must be enabled (default).
For v2 signatures x509 certificate (containing the public key) could be appended to the
private key (they both are in PEM format) to automatically extract keyid from its Subject
Key Identifier (SKID).
Integrity keyrings Integrity keyrings
---------------- ----------------

View File

@ -976,8 +976,12 @@ static int sign_hash_v2(const char *algo, const unsigned char *hash,
if (imaevm_params.keyid) if (imaevm_params.keyid)
keyid = htonl(imaevm_params.keyid); keyid = htonl(imaevm_params.keyid);
else else {
int keyid_read_failed = read_keyid_from_cert(&keyid, keyfile, false);
if (keyid_read_failed)
calc_keyid_v2(&keyid, name, pkey); calc_keyid_v2(&keyid, name, pkey);
}
hdr->keyid = keyid; hdr->keyid = keyid;
st = "EVP_PKEY_CTX_new"; st = "EVP_PKEY_CTX_new";

View File

@ -20,13 +20,14 @@ PATH=../src:$PATH
type openssl type openssl
log() { log() {
echo - "$*" echo >&2 - "$*"
eval "$@" eval "$@"
} }
if [ "$1" = clean ]; then if [ "$1" = clean ]; then
rm -f test-ca.conf rm -f test-ca.conf
elif [ "$1" = force ] || [ ! -e test-ca.conf ]; then elif [ "$1" = force ] || [ ! -e test-ca.conf ] \
|| [ gen-keys.sh -nt test-ca.conf ]; then
cat > test-ca.conf <<- EOF cat > test-ca.conf <<- EOF
[ req ] [ req ]
distinguished_name = req_distinguished_name distinguished_name = req_distinguished_name
@ -43,26 +44,44 @@ cat > test-ca.conf <<- EOF
basicConstraints=CA:TRUE basicConstraints=CA:TRUE
subjectKeyIdentifier=hash subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer authorityKeyIdentifier=keyid:always,issuer
[ skid ]
basicConstraints=CA:TRUE
subjectKeyIdentifier=12345678
authorityKeyIdentifier=keyid:always,issuer
EOF EOF
fi fi
# RSA # RSA
# Second key will be used for wrong key tests. # Second key will be used for wrong key tests.
for m in 1024 2048; do for m in 1024 1024_skid 2048; do
if [ "$1" = clean ] || [ "$1" = force ]; then if [ "$1" = clean ] || [ "$1" = force ] \
|| [ gen-keys.sh -nt test-rsa$m.key ]; then
rm -f test-rsa$m.cer test-rsa$m.key test-rsa$m.pub rm -f test-rsa$m.cer test-rsa$m.key test-rsa$m.pub
fi fi
if [ "$1" = clean ]; then if [ "$1" = clean ]; then
continue continue
fi fi
if [ -z "${m%%*_*}" ]; then
# Add named extension.
bits=${m%_*}
ext="-extensions ${m#*_}"
else
bits=$m
ext=
fi
if [ ! -e test-rsa$m.key ]; then if [ ! -e test-rsa$m.key ]; then
log openssl req -verbose -new -nodes -utf8 -sha1 -days 10000 -batch -x509 \ log openssl req -verbose -new -nodes -utf8 -sha1 -days 10000 -batch -x509 $ext \
-config test-ca.conf \ -config test-ca.conf \
-newkey rsa:$m \ -newkey rsa:$bits \
-out test-rsa$m.cer -outform DER \ -out test-rsa$m.cer -outform DER \
-keyout test-rsa$m.key -keyout test-rsa$m.key
# for v1 signatures # for v1 signatures
log openssl pkey -in test-rsa$m.key -out test-rsa$m.pub -pubout log openssl pkey -in test-rsa$m.key -out test-rsa$m.pub -pubout
if [ $m = 1024_skid ]; then
# Create combined key+cert.
log openssl x509 -inform DER -in test-rsa$m.cer >> test-rsa$m.key
fi
fi fi
done done

View File

@ -367,6 +367,7 @@ sign_verify rsa1024 sha1 0x030202:K:0080
sign_verify rsa1024 sha224 0x030207:K:0080 sign_verify rsa1024 sha224 0x030207:K:0080
expect_pass check_sign TYPE=ima KEY=rsa1024 ALG=sha256 PREFIX=0x030204aabbccdd0080 OPTS=--keyid=aabbccdd expect_pass check_sign TYPE=ima KEY=rsa1024 ALG=sha256 PREFIX=0x030204aabbccdd0080 OPTS=--keyid=aabbccdd
expect_pass check_sign TYPE=ima KEY=rsa1024 ALG=sha256 PREFIX=0x030204:K:0080 OPTS=--keyid-from-cert=test-rsa1024.cer expect_pass check_sign TYPE=ima KEY=rsa1024 ALG=sha256 PREFIX=0x030204:K:0080 OPTS=--keyid-from-cert=test-rsa1024.cer
expect_pass check_sign TYPE=ima KEY=rsa1024_skid ALG=sha256 PREFIX=0x030204123456780080
sign_verify rsa1024 sha256 0x030204:K:0080 sign_verify rsa1024 sha256 0x030204:K:0080
try_different_keys try_different_keys
try_different_sigs try_different_sigs