Краткий экскурс https://ru.wikipedia.org/wiki/DSA#.D0.9F.D1.80.D0.BE.D0.B2.D0.B5.D1.80.D0.BA....
Есть такая либа - polarssl, нынче называется mbedtls, суть проблемы в том, что в ней нет DSA, но есть большие числа, с созданием подписи проблем не возникло, а вот проверка - никак не идет.
В openssl - есть готовая функция, которая вычисляет v, а в protossl - нет, нашел в интернетах вариант v = (g^u1 * y^u2 mod p) mod q = (((g^u1 mod p) * (y^u2 mod p)) mod p) mod q - но либо криво записал, либо просто не сработало.
В общем очень нужна помощь с написанием этого чуда правильно. Относительно формулы выше выглядит так:
mpi_inv_mod(&w, &s, &q); - 1й шаг
mpi_mul_mpi(&u1, &hash, &w);
mpi_mod_mpi(&u1, &u1, &q); - 2й шаг
mpi_mul_mpi(&u2, &r, &w);
mpi_mod_mpi(&u2, &u2, &q); - 3й шаг, тут все правильно.
mpi_exp_mod(&u1, &g, &u1, &p, &t);
mpi_exp_mod(&u2, &pub, &u2, &p, &t);
mpi_mul_mpi(&v, &u1, &u2);
mpi_mod_mpi(&v, &v, &p);
mpi_mod_mpi(&v, &v, &q);
bool ret = mpi_cmp_mpi(&v, &r) == 0;
Фактически больше надо помощи с тем, как формулу можно иначе записать, т.к. не все функции есть в либе.