#include "crypto.h" #include "util.h" char* int_to_str(mpz_t n) { char* res; int len; len = (int) mpz_sizeinbase(n, 256); res = malloc(len + 1); ASSERT(res != NULL); mpz_export(res, NULL, 1, 1, 0, 0, n); res[len] = '\0'; return res; } int check_signature(const char *msg, const char *sig_str, const char *exp_str, const char *mod_str) { mpz_t m, e, n, sig; char *_msg; int valid; mpz_init_set_str(e, exp_str, 0); mpz_init_set_str(n, mod_str, 0); mpz_init_set_str(sig, sig_str, 0); mpz_init(m); mpz_powm(m, sig, e, n); _msg = int_to_str(m); valid = !strcmp(msg, _msg); mpz_clear(n); mpz_clear(e); mpz_clear(sig); mpz_clear(m); free(_msg); return valid; }