Cómo validar el certificado X.509 en C # usando Compact Framework

Estoy tratando de validar un certificado X.509 usando C # y .NetCF. Tengo el certificado de CA y, si lo entiendo correctamente, necesito usar la clave pública de este certificado de CA para descifrar la firma del certificado que no es de confianza. Esto debería darme el valor hash calculado del certificado no confiable. Entonces debería calcular el hash del certificado y asegurarme de que los dos valores coincidan.

He estado jugando con esto durante unos días y no estoy llegando muy lejos. He estado usando las clases X509Certificate y RSACryptoServiceProvider. Primero, intenté obtener la clave pública y la firma de la clase X509Certificate. Pude obtener la clave pública pero no la firma. Luego, intenté analizar los datos binarios que formaban el certificado, lo que me permitió obtener la firma (y cualquier otro dato que quisiera), pero no pude descifrar la firma utilizando el RSACryptoServiceProvider. Intenté cosas como esta, pero seguí recibiendo excepciones que decían "Clave incorrecta" cuando intentaba descifrar:

RSAParameters rsaParams = new RSAParameters();
rsaParams.Exponent = exp;
rsaParams.Modulus = mod;
RSACryptoServiceProvider rsaServ = new RSACryptoServiceProvider();
rsaServ.ImportParameters(rsaParams);
byte[] decryptedSig = rsaServ.Decrypt(encryptedSig, false);

Cualquier consejo sería muy apreciado.

Editar: intenté algo que parece ser mejor, pero está devolviendo un resultado extraño. Estoy trabajando con la clase X509Certificate2 aquí porque es un poco más fácil de probar, pero tendré que cambiar a X509Certificate para .NetCF más adelante. Creo que RSACryptoServiceProvider.VerifyData podría ser lo que necesito. Intenté el siguiente código.

X509Certificate2 cert = new X509Certificate2(certBytes);
X509Certificate2 certCA1 = new X509Certificate2(@"C:\certs\certCA1.cer");

byte[] encryptedSig = new byte[256];
Array.Copy(certBytes, certBytes.Length - 256, encryptedSig, 0, 256);

RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)certA1.PublicKey.Key;
bool good = rsa.VerifyData(cert.RawData, "1.3.14.3.2.26", encryptedSig);

Como dije, puedo decodificar e interpretar manualmente los datos binarios del certificado, así que estoy bastante seguro de que cert.RawData son los datos firmados del certificado y los últimos 256 bytes son la firma cifrada. La cadena es el OID del algoritmo hash, que obtuve del certificado, pero no estoy 100% seguro de que sea correcto. VerifyData devuelve falso, pero todavía no estoy seguro de por qué.

Pensamientos?

Respuestas a la pregunta(3)

Su respuesta a la pregunta