ima-evm-utils: convert sign v2 from RSA to EVP_PKEY API
RFC PATCH v2 1/1 ima-evm-utils: convert sign v2 from RSA to EVP_PKEY API
Convert sign_v2 and related to using EVP_PKEY API instead of RSA API. This enables more signatures to work out of the box.
Remove RSA_ASN1_templates[] as it does not needed anymore. OpenSSL sign is doing proper PKCS1 padding automatically (tested to be compatible with previous version, except for MD4). This also fixes bug with MD4 which produced wrong signature because of absence of the appropriate RSA_ASN1_template.
---
Changes since v1:
- More key neutral code in calc_keyid_v1().
- Fix uninitialized sigsize for EVP_PKEY_sign().
- Fix memory leaks for openssl types.
src/evmctl.c | 29 +++--- src/imaevm.h | 4 +- src/libimaevm.c | 277 +++++++++++++++++++++++++++----------------------------- 3 files changed, 152 insertions(+), 158 deletions(-)
src/evmctl.c +17 -12
@@ -510,7 +510,7 @@ static int calc_evm_hash(const char *file, unsigned char *hash)static int sign_evm (const char *file,const char *key) {unsigned char hash[MAX_DIGEST_SIZE ]; -unsigned char sig[MAX_SIGNATURE_SIZE ]; +unsigned char sig[MAX_SIGNATURE_SIZE +1 ];int len, err; len =calc_evm_hash (file, hash);
@@ -519,7 +519,7 @@ static int sign_evm(const char *file, const char *key)return len; len =sign_hash (params.hash_algo, hash, len, key,NULL , sig +1 ); -assert (len <sizeof (sig)); +assert (len <MAX_SIGNATURE_SIZE );if (len <=1 )return len;
@@ -891,7 +891,6 @@ static int cmd_import(struct command *cmd)int id, len, err =0 ;char name[20 ];uint8_t keyid[8 ]; -RSA *key; inkey = g_argv[optind++];if (!inkey) {
@@ -925,18 +924,26 @@ static int cmd_import(struct command *cmd) } } - key =read_pub_key (inkey, params.x509); -if (!key) -return 1 ; -if (params.x509) { +EVP_PKEY *pkey =read_pub_pkey (inkey, params.x509); + +if (!pkey) +return 1 ; pub =file2bin (inkey,NULL , &len); -if (!pub) - goto out; -calc_keyid_v2 ((uint32_t *)keyid, name, key); +if (!pub) { +EVP_PKEY_free (pkey); +return 1 ; + } +calc_keyid_v2 ((uint32_t *)keyid, name, pkey); +EVP_PKEY_free (pkey); }else { +RSA *key =read_pub_key (inkey, params.x509); + +if (!key) +return 1 ; len =key2bin (key, pub);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);
@@ -951,8 +958,6 @@ static int cmd_import(struct command *cmd) }if (params.x509)free (pub); -out: -RSA_free (key);return err; }
src/imaevm.h +2 -2
@@ -208,7 +208,6 @@ struct RSA_ASN1_template {#define NUM_PCRS 20#define DEFAULT_PCR 10 -extern const struct RSA_ASN1_template RSA_ASN1_templates[PKEY_HASH__LAST ];extern struct libevm_params params;void do_dump (FILE *fp,const void *ptr,int len,bool cr);
@@ -217,9 +216,10 @@ int get_filesize(const char *filename);int ima_calc_hash (const char *file,uint8_t *hash);int get_hash_algo (const char *algo);RSA *read_pub_key (const char *keyfile,int x509); +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_v2 (uint32_t *keyid,char *str,RSA *key); +void calc_keyid_v2 (uint32_t *keyid,char *str,EVP_PKEY *key);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);
src/libimaevm.c +133 -144
413 lines not on this page · raw message
Signature · 1 line
2.11.0
Mimi, Dmitry,
Quoted 16 lines · Vitaly Chikunov
Convert
sign_v2and related to usingEVP_PKEYAPI instead of RSA API. This enables more signatures to work out of the box.Remove RSA_ASN1_templates[] as it does not needed anymore. OpenSSL sign is doing proper PKCS1 padding automatically (tested to be compatible with previous version, except for MD4). This also fixes bug with MD4 which produced wrong signature because of absence of the appropriate
RSA_ASN1_template.Signed-off-by Vitaly Chikunov <[email protected]>---
Changes since v1:
- More key neutral code incalc_keyid_v1().
- Fix uninitialized sigsize forEVP_PKEY_sign().
- Fix memory leaks for openssl types.
Quoted 4 lines
src/evmctl.c | 29 +++--- src/imaevm.h | 4 +- src/libimaevm.c | 277 +++++++++++++++++++++++++++----------------------------- 3 files changed, 152 insertions(+), 158 deletions(-)
This probably should be rebased and resent after you make decision on "[PATCH v2] ima-evm-utils: simplify digest alias handling".
Also, this is ping.