static inline void ev_debug(enum ev_type type, union ev_val *val, uint32_t count) { switch (type) { case ev_string: cli_dbgmsg("\t(%u): %s\n", count, val->v_string); break; case ev_data: { char *d = cli_str2hex(val->v_data, count); cli_dbgmsg("\t%d bytes\n", count); cli_dbgmsg("\t%s\n", d); free(d); break; } case ev_data_fast: cli_dbgmsg("\t%08x checksum, %u bytes\n", (uint32_t)val->v_int, count); break; case ev_int: cli_dbgmsg("\t(%u): 0x%llx\n", count, (long long)val->v_int); break; case ev_time: cli_dbgmsg("\t(%u): %d.%06us\n", count, (signed)(val->v_int / 1000000), (unsigned)(val->v_int % 1000000)); break; } }
int cli_versig(const char *md5, const char *dsig) { mp_int n, e; char *pt, *pt2; if(strlen(md5) != 32 || !isalnum(md5[0])) { /* someone is trying to fool us with empty/malformed MD5 ? */ cli_errmsg("SECURITY WARNING: MD5 basic test failure.\n"); return CL_EVERIFY; } mp_init(&n); mp_read_radix(&n, CLI_NSTR, 10); mp_init(&e); mp_read_radix(&e, CLI_ESTR, 10); if(!(pt = (char *) cli_decodesig(dsig, 16, e, n))) { mp_clear(&n); mp_clear(&e); return CL_EVERIFY; } pt2 = cli_str2hex(pt, 16); free(pt); cli_dbgmsg("cli_versig: Decoded signature: %s\n", pt2); if(strncmp(md5, pt2, 32)) { cli_dbgmsg("cli_versig: Signature doesn't match.\n"); free(pt2); mp_clear(&n); mp_clear(&e); return CL_EVERIFY; } free(pt2); mp_clear(&n); mp_clear(&e); cli_dbgmsg("cli_versig: Digital signature is correct.\n"); return CL_SUCCESS; }