La función RSA_verify toma los siguientes parámetros:
int RSA_verify(int type, unsigned char*m, unsigned int m_len,
unsigned char *sigbuf, unsigned int siglen, RSA* rsa);
el primer parámetro es el tipo de algoritmo de resumen de mensajes, como NID_sha256.
Dado que este código no tiene hash en el mensaje, la variable m es el mensaje con hash, ¿cuál es el propósito de pasar el primer parámetro?
¿Se almacena el tipo de algoritmo hash en algún lugar y se verifica que se esté utilizando el mismo algoritmo para verificar que se usó para firmar? Si es así, este int no tiene nada que ver con la función que se usó, fácilmente podría estar equivocado.