return _gnutls_pk_verify(params.pk, hash, signature,
&key->params, ¶ms);
} else {
- params.pk = key->pk_algorithm;
- params.dig = gnutls_sign_get_hash_algorithm(algo);
- /* This can be NULL here, if pubkey is DSA. For RSA it
- * is checked below. */
- me = hash_to_entry(params.dig);
-
- if (flags & GNUTLS_VERIFY_USE_RSA_PSS) {
- int ret;
- gnutls_pk_algorithm_t pk;
- unsigned bits;
-
- ret = gnutls_pubkey_get_pk_algorithm(key, &bits);
- if (ret < 0) {
- gnutls_assert();
- return GNUTLS_E_INVALID_REQUEST;
+ if (algo == GNUTLS_SIGN_UNKNOWN) {
+ params.pk = key->pk_algorithm;
+ me = NULL;
+ } else {
+ params.pk = gnutls_sign_get_pk_algorithm(algo);
+ params.dig = gnutls_sign_get_hash_algorithm(algo);
+
+ me = hash_to_entry(params.dig);
+
+ if (params.pk != key->pk_algorithm) {
+ if (!gnutls_sign_supports_pk_algorithm(algo, key->pk_algorithm)) {
+ _gnutls_debug_log("have key: %s/%d, with sign %s/%d\n",
+ gnutls_pk_get_name(key->pk_algorithm), key->pk_algorithm,
+ gnutls_sign_get_name(algo), algo);
+ return gnutls_assert_val(GNUTLS_E_INCOMPATIBLE_SIG_WITH_KEY);
+ }
}
+ }
- pk = ret;
-
+ if (params.pk == GNUTLS_PK_RSA_PSS) {
/* The requested sign algorithm is RSA-PSS, while the
* pubkey doesn't include parameter information */
- if (pk == GNUTLS_PK_RSA) {
+ if (key->pk_algorithm == GNUTLS_PK_RSA) {
if (me == NULL)
return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
params.salt_size =
- _gnutls_find_rsa_pss_salt_size(bits, me, 0);
+ _gnutls_find_rsa_pss_salt_size(key->bits, me, 0);
}
- params.pk = GNUTLS_PK_RSA_PSS;
}
return pubkey_verify_hashed_data(params.pk, me,
* params[1] is public key
*/
static int
-_pkcs1_rsa_verify_sig(const mac_entry_st * me,
+_pkcs1_rsa_verify_sig(gnutls_pk_algorithm_t pk,
+ const mac_entry_st * me,
const gnutls_datum_t * text,
const gnutls_datum_t * prehash,
const gnutls_datum_t * signature,
d.data = cmp;
d.size = digest_size;
- /* decrypted is a BER encoded data of type DigestInfo
- */
- ret = encode_ber_digest_info(me, &d, &di);
- if (ret < 0)
- return gnutls_assert_val(ret);
+ if (pk == GNUTLS_PK_RSA) {
+ /* decrypted is a BER encoded data of type DigestInfo
+ */
+ ret = encode_ber_digest_info(me, &d, &di);
+ if (ret < 0)
+ return gnutls_assert_val(ret);
- ret = _gnutls_pk_verify(GNUTLS_PK_RSA, &di, signature, params,
- sign_params);
- _gnutls_free_datum(&di);
+ ret = _gnutls_pk_verify(pk, &di, signature, params,
+ sign_params);
+ _gnutls_free_datum(&di);
+ } else {
+ ret = _gnutls_pk_verify(pk, &d, signature, params,
+ sign_params);
+ }
return ret;
}
{
switch (pk) {
case GNUTLS_PK_RSA:
+ case GNUTLS_PK_RSA_PSS:
if (_pkcs1_rsa_verify_sig
- (hash_algo, NULL, hash, signature, params, sign_params) != 0)
+ (pk, hash_algo, NULL, hash, signature, params, sign_params) != 0)
{
gnutls_assert();
return GNUTLS_E_PK_SIG_VERIFY_FAILED;
return 1;
break;
- case GNUTLS_PK_RSA_PSS:
case GNUTLS_PK_EC:
case GNUTLS_PK_DSA:
if (dsa_verify_hashed_data
{
switch (pk) {
case GNUTLS_PK_RSA:
+ case GNUTLS_PK_RSA_PSS:
if (_pkcs1_rsa_verify_sig
- (me, data, NULL, signature, params, sign_params) != 0) {
+ (pk, me, data, NULL, signature, params, sign_params) != 0) {
gnutls_assert();
return GNUTLS_E_PK_SIG_VERIFY_FAILED;
}
return 1;
break;
- case GNUTLS_PK_RSA_PSS:
case GNUTLS_PK_EC:
case GNUTLS_PK_DSA:
if (dsa_verify_data