mirror of
https://git.code.sf.net/p/linux-ima/ima-evm-utils
synced 2025-04-28 14:43:37 +02:00
ima-evm-utils: Convert cmd_import and calc keyid v2 to EVP_PKEY API
Introduce calc_pkeyid_v2() (which accepts EVP_PKEY) to replace calc_keyid_v2() (which accepts RSA) in the future and use it in cmd_import(). Signed-off-by: Vitaly Chikunov <vt@altlinux.org> Acked-by: Dmitry Kasatkin <dmitry.kasatkin@gmail.com> Signed-off-by: Mimi Zohar <zohar@linux.ibm.com>
This commit is contained in:
parent
3df7b5d779
commit
af4e3c06bb
27
src/evmctl.c
27
src/evmctl.c
@ -891,7 +891,6 @@ static int cmd_import(struct command *cmd)
|
|||||||
int id, len, err = 0;
|
int id, len, err = 0;
|
||||||
char name[20];
|
char name[20];
|
||||||
uint8_t keyid[8];
|
uint8_t keyid[8];
|
||||||
RSA *key;
|
|
||||||
|
|
||||||
inkey = g_argv[optind++];
|
inkey = g_argv[optind++];
|
||||||
if (!inkey) {
|
if (!inkey) {
|
||||||
@ -925,18 +924,26 @@ static int cmd_import(struct command *cmd)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
key = read_pub_key(inkey, params.x509);
|
if (params.x509) {
|
||||||
|
EVP_PKEY *pkey = read_pub_pkey(inkey, params.x509);
|
||||||
|
|
||||||
|
if (!pkey)
|
||||||
|
return 1;
|
||||||
|
pub = file2bin(inkey, NULL, &len);
|
||||||
|
if (!pub) {
|
||||||
|
EVP_PKEY_free(pkey);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
calc_pkeyid_v2((uint32_t *)keyid, name, pkey);
|
||||||
|
EVP_PKEY_free(pkey);
|
||||||
|
} else {
|
||||||
|
RSA *key = read_pub_key(inkey, params.x509);
|
||||||
|
|
||||||
if (!key)
|
if (!key)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
if (params.x509) {
|
|
||||||
pub = file2bin(inkey, NULL, &len);
|
|
||||||
if (!pub)
|
|
||||||
goto out;
|
|
||||||
calc_keyid_v2((uint32_t *)keyid, name, key);
|
|
||||||
} else {
|
|
||||||
len = key2bin(key, pub);
|
len = key2bin(key, pub);
|
||||||
calc_keyid_v1(keyid, name, pub, len);
|
calc_keyid_v1(keyid, name, pub, len);
|
||||||
|
RSA_free(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
log_info("Importing public key %s from file %s into keyring %d\n", name, inkey, id);
|
log_info("Importing public key %s from file %s into keyring %d\n", name, inkey, id);
|
||||||
@ -951,8 +958,6 @@ static int cmd_import(struct command *cmd)
|
|||||||
}
|
}
|
||||||
if (params.x509)
|
if (params.x509)
|
||||||
free(pub);
|
free(pub);
|
||||||
out:
|
|
||||||
RSA_free(key);
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -220,6 +220,7 @@ EVP_PKEY *read_pub_pkey(const char *keyfile, int x509);
|
|||||||
|
|
||||||
void calc_keyid_v1(uint8_t *keyid, char *str, const unsigned char *pkey, int len);
|
void calc_keyid_v1(uint8_t *keyid, char *str, const unsigned char *pkey, int len);
|
||||||
void calc_keyid_v2(uint32_t *keyid, char *str, RSA *key);
|
void calc_keyid_v2(uint32_t *keyid, char *str, RSA *key);
|
||||||
|
void calc_pkeyid_v2(uint32_t *keyid, char *str, EVP_PKEY *pkey);
|
||||||
int key2bin(RSA *key, unsigned char *pub);
|
int key2bin(RSA *key, unsigned char *pub);
|
||||||
|
|
||||||
int sign_hash(const char *algo, const unsigned char *hash, int size, const char *keyfile, const char *keypass, unsigned char *sig);
|
int sign_hash(const char *algo, const unsigned char *hash, int size, const char *keyfile, const char *keypass, unsigned char *sig);
|
||||||
|
@ -753,6 +753,36 @@ void calc_keyid_v2(uint32_t *keyid, char *str, RSA *key)
|
|||||||
free(pkey);
|
free(pkey);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Calculate keyid of the public_key part of EVP_PKEY
|
||||||
|
*/
|
||||||
|
void calc_pkeyid_v2(uint32_t *keyid, char *str, EVP_PKEY *pkey)
|
||||||
|
{
|
||||||
|
X509_PUBKEY *pk = NULL;
|
||||||
|
const unsigned char *public_key = NULL;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
/* This is more generic than i2d_PublicKey() */
|
||||||
|
if (X509_PUBKEY_set(&pk, pkey) &&
|
||||||
|
X509_PUBKEY_get0_param(NULL, &public_key, &len, NULL, pk)) {
|
||||||
|
uint8_t sha1[SHA_DIGEST_LENGTH];
|
||||||
|
|
||||||
|
SHA1(public_key, len, sha1);
|
||||||
|
/* sha1[12 - 19] is exactly keyid from gpg file */
|
||||||
|
memcpy(keyid, sha1 + 16, 4);
|
||||||
|
} else
|
||||||
|
*keyid = 0;
|
||||||
|
|
||||||
|
log_debug("keyid: ");
|
||||||
|
log_debug_dump(keyid, 4);
|
||||||
|
sprintf(str, "%x", __be32_to_cpup(keyid));
|
||||||
|
|
||||||
|
if (params.verbose > LOG_INFO)
|
||||||
|
log_info("keyid: %s\n", str);
|
||||||
|
|
||||||
|
X509_PUBKEY_free(pk);
|
||||||
|
}
|
||||||
|
|
||||||
static EVP_PKEY *read_priv_pkey(const char *keyfile, const char *keypass)
|
static EVP_PKEY *read_priv_pkey(const char *keyfile, const char *keypass)
|
||||||
{
|
{
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user