sig += 4, siglen -= 4;
static int dss_verifysig(char *sig, int siglen, char *data, int datalen) {    char *p;    int i, slen;    char hash[20];    Bignum qm2, r, s, w, i1, i2, i3, u1, u2, sha, v;    int ret;    if (!dss_p)        return 0;    getstring(&sig, &siglen, &p, &slen);    if (!p || memcmp(p, "ssh-dss", 7)) {        return 0;    }    sig += 4, siglen -= 4;             /* skip yet another length field */    r = get160(&sig, &siglen);    s = get160(&sig, &siglen);    if (!r || !s)        return 0;    /*     * Step 1. w <- s^-1 mod q.     */    w = newbn(dss_q[0]);    qm2 = copybn(dss_q);    decbn(qm2); decbn(qm2);    /* Now qm2 is q-2, and by Fermat's Little Theorem, s^qm2 == s^-1 (mod q).     * This is a silly way to do it; may fix it later. */    modpow(s, qm2, dss_q, w);    /*     * Step 2. u1 <- SHA(message) * w mod q.     */    u1 = newbn(dss_q[0]);    SHA_Simple(data, datalen, hash);    p = hash; slen = 20; sha = get160(&p, &slen);    modmul(sha, w, dss_q, u1);    /*     * Step 3. u2 <- r * w mod q.     */    u2 = newbn(dss_q[0]);    modmul(r, w, dss_q, u2);    /*     * Step 4. v <- (g^u1 * y^u2 mod p) mod q.     */    i1 = newbn(dss_p[0]);    i2 = newbn(dss_p[0]);    i3 = newbn(dss_p[0]);    v = newbn(dss_q[0]);    modpow(dss_g, u1, dss_p, i1);    modpow(dss_y, u2, dss_p, i2);    modmul(i1, i2, dss_p, i3);    modmul(i3, One, dss_q, v);    /*     * Step 5. v should now be equal to r.     */    ret = 1;    for (i = 1; i <= v[0] || i <= r[0]; i++) {        if ((i > v[0] && r[i] != 0) ||            (i > r[0] && v[i] != 0) ||            (i <= v[0] && i <= r[0] && r[i] != v[i]))            ret = 0;    }    freebn(w);    freebn(qm2);    freebn(sha);    freebn(i1);    freebn(i2);    freebn(i3);    freebn(v);    freebn(r);    freebn(s);    return ret;}