pkcs11: Optionally hash data for PKCS#1 v1.5 RSA signatures in software
If cards/libraries don't support signature mechanisms with hashing, we fall back to do it ourselves in software and pass the PKCS#1 digestInfo ASN.1 structure to sign via CKM_RSA_PKCS mechanism. Closes strongswan/strongswan#168.
This commit is contained in:
@@ -211,8 +211,8 @@ METHOD(public_key_t, verify, bool,
|
||||
chunk_t hash = chunk_empty, parse, r, s;
|
||||
size_t len;
|
||||
|
||||
mechanism = pkcs11_signature_scheme_to_mech(scheme, this->type, this->k,
|
||||
&hash_alg);
|
||||
mechanism = pkcs11_signature_scheme_to_mech(this->lib, this->slot, scheme,
|
||||
this->type, this->k, &hash_alg);
|
||||
if (!mechanism)
|
||||
{
|
||||
DBG1(DBG_LIB, "signature scheme %N not supported",
|
||||
@@ -277,6 +277,21 @@ METHOD(public_key_t, verify, bool,
|
||||
return FALSE;
|
||||
}
|
||||
hasher->destroy(hasher);
|
||||
switch (scheme)
|
||||
{
|
||||
case SIGN_RSA_EMSA_PKCS1_SHA1:
|
||||
case SIGN_RSA_EMSA_PKCS1_SHA2_256:
|
||||
case SIGN_RSA_EMSA_PKCS1_SHA2_384:
|
||||
case SIGN_RSA_EMSA_PKCS1_SHA2_512:
|
||||
/* encode PKCS#1 digestInfo if the token does not support it */
|
||||
hash = asn1_wrap(ASN1_SEQUENCE, "mm",
|
||||
asn1_algorithmIdentifier(
|
||||
hasher_algorithm_to_oid(hash_alg)),
|
||||
asn1_wrap(ASN1_OCTET_STRING, "m", hash));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
data = hash;
|
||||
}
|
||||
rv = this->lib->f->C_Verify(session, data.ptr, data.len, sig.ptr, sig.len);
|
||||
|
||||
Reference in New Issue
Block a user