Add basic PSS cert verification
Still todo:
- handle MGF-hash != sign-hash
- check effective salt len == announced salt len
- add support in the PK layer so that we don't have to bypass it here
diff --git a/library/x509_crt.c b/library/x509_crt.c
index de95c0f..fbc3989 100644
--- a/library/x509_crt.c
+++ b/library/x509_crt.c
@@ -1669,6 +1669,21 @@
continue;
}
+#if defined(POLARSSL_RSASSA_PSS_CERTIFICATES)
+ if( child->sig_pk == POLARSSL_PK_RSASSA_PSS )
+ {
+ if( pk_can_do( &trust_ca->pk, POLARSSL_PK_RSA ) == 0 ||
+ rsa_rsassa_pss_verify( pk_rsa( trust_ca->pk ),
+ NULL, NULL, RSA_PUBLIC,
+ child->sig_md,
+ md_info->size, hash,
+ child->sig.p ) != 0 )
+ {
+ continue;
+ }
+ }
+ else
+#endif
if( pk_can_do( &trust_ca->pk, child->sig_pk ) == 0 ||
pk_verify( &trust_ca->pk, child->sig_md, hash, md_info->size,
child->sig.p, child->sig.len ) != 0 )
@@ -1758,6 +1773,21 @@
{
md( md_info, child->tbs.p, child->tbs.len, hash );
+#if defined(POLARSSL_RSASSA_PSS_CERTIFICATES)
+ if( child->sig_pk == POLARSSL_PK_RSASSA_PSS )
+ {
+ if( pk_can_do( &parent->pk, POLARSSL_PK_RSA ) == 0 ||
+ rsa_rsassa_pss_verify( pk_rsa( parent->pk ),
+ NULL, NULL, RSA_PUBLIC,
+ child->sig_md,
+ md_info->size, hash,
+ child->sig.p ) != 0 )
+ {
+ *flags |= BADCERT_NOT_TRUSTED;
+ }
+ }
+ else
+#endif
if( pk_can_do( &parent->pk, child->sig_pk ) == 0 ||
pk_verify( &parent->pk, child->sig_md, hash, md_info->size,
child->sig.p, child->sig.len ) != 0 )