botan: Share code to generate RSA EMSA PSS signature identifier strings

This commit is contained in:
Tobias Brunner
2018-09-17 18:51:40 +02:00
parent 2788529827
commit dc09570a12
2 changed files with 26 additions and 36 deletions
@@ -61,14 +61,11 @@ struct private_botan_rsa_private_key_t {
}; };
/** /**
* Build an EMSA PSS signature described in PKCS#1 * Get the Botan string identifier for an EMSA PSS signature
*/ */
static bool build_emsa_pss_signature(private_botan_rsa_private_key_t *this, bool botan_emsa_pss_identifier(rsa_pss_params_t *params, char *id, size_t len)
rsa_pss_params_t *params, chunk_t data,
chunk_t *sig)
{ {
const char *hash; const char *hash;
char hash_and_padding[BUF_LEN];
if (!params) if (!params)
{ {
@@ -90,13 +87,25 @@ static bool build_emsa_pss_signature(private_botan_rsa_private_key_t *this,
if (params->salt_len > RSA_PSS_SALT_LEN_DEFAULT) if (params->salt_len > RSA_PSS_SALT_LEN_DEFAULT)
{ {
snprintf(hash_and_padding, sizeof(hash_and_padding), return snprintf(id, len, "EMSA-PSS(%s,MGF1,%zd)", hash,
"EMSA-PSS(%s,MGF1,%u)", hash, params->salt_len); params->salt_len) < len;
} }
else return snprintf(id, len, "EMSA-PSS(%s,MGF1)", hash) < len;
}
/**
* Build an EMSA PSS signature described in PKCS#1
*/
static bool build_emsa_pss_signature(private_botan_rsa_private_key_t *this,
rsa_pss_params_t *params, chunk_t data,
chunk_t *sig)
{
char hash_and_padding[BUF_LEN];
if (!botan_emsa_pss_identifier(params, hash_and_padding,
sizeof(hash_and_padding)))
{ {
snprintf(hash_and_padding, sizeof(hash_and_padding), return FALSE;
"EMSA-PSS(%s,MGF1)", hash);
} }
return botan_get_signature(this->key, hash_and_padding, data, sig); return botan_get_signature(this->key, hash_and_padding, data, sig);
} }
@@ -63,6 +63,11 @@ struct private_botan_rsa_public_key_t {
refcount_t ref; refcount_t ref;
}; };
/**
* Defined in botan_rsa_private_key.c
*/
bool botan_emsa_pss_identifier(rsa_pss_params_t *params, char *id, size_t len);
/** /**
* Verify RSA signature * Verify RSA signature
*/ */
@@ -97,37 +102,13 @@ static bool verify_emsa_pss_signature(private_botan_rsa_public_key_t *this,
rsa_pss_params_t *params, chunk_t data, rsa_pss_params_t *params, chunk_t data,
chunk_t signature) chunk_t signature)
{ {
const char *hash;
char hash_and_padding[BUF_LEN]; char hash_and_padding[BUF_LEN];
if (!params) if (!botan_emsa_pss_identifier(params, hash_and_padding,
sizeof(hash_and_padding)))
{ {
return FALSE; return FALSE;
} }
/* botan currently does not support passing the mgf1 hash */
if (params->hash != params->mgf1_hash)
{
DBG1(DBG_LIB, "passing mgf1 hash not supported via botan");
return FALSE;
}
hash = botan_get_hash(params->hash);
if (!hash)
{
return FALSE;
}
if (params->salt_len > RSA_PSS_SALT_LEN_DEFAULT)
{
snprintf(hash_and_padding, sizeof(hash_and_padding),
"EMSA-PSS(%s,MGF1,%u)", hash, params->salt_len);
}
else
{
snprintf(hash_and_padding, sizeof(hash_and_padding),
"EMSA-PSS(%s,MGF1)", hash);
}
return verify_rsa_signature(this, hash_and_padding, data, signature); return verify_rsa_signature(this, hash_and_padding, data, signature);
} }