/* -*-c-*-
*
- * $Id: dsig.c,v 1.1 2000/06/17 10:54:29 mdw Exp $
+ * $Id: dsig.c,v 1.2 2000/07/01 11:27:22 mdw Exp $
*
* Verify signatures on distribuitions of files
*
/*----- Revision history --------------------------------------------------*
*
* $Log: dsig.c,v $
+ * Revision 1.2 2000/07/01 11:27:22 mdw
+ * Use new PKCS#1 padding functions rather than rolling by hand.
+ *
* Revision 1.1 2000/06/17 10:54:29 mdw
* Program to generate and verify signatures on multiple files.
*
#include "key-data.h"
#include "md5.h"
#include "noise.h"
+#include "pkcs1.h"
#include "rmd160.h"
#include "rsa.h"
#include "sha.h"
static int rsasign(key *k, const void *m, size_t msz, dstr *d)
{
rsa_priv rp;
+ rsa_privctx rpc;
+ pkcs1 pk = { 0, 0, 0 };
key_packstruct ks[RSA_PRIVFETCHSZ];
key_packdef *kp;
- octet *p;
- size_t sz;
- mp *x;
int e;
kp = key_fetchinit(rsa_privfetch, ks, &rp);
key_fetchdone(kp);
return (e);
}
- sz = mp_octets(rp.n);
- if (sz < msz + 11)
- die(EXIT_FAILURE, "key too small (help!)");
- DENSURE(d, sz);
- p = d->buf + d->len;
- memcpy(p + sz - msz, m, msz);
- p[0] = 0;
- p[1] = 1;
- memset(p + 2, 0xff, sz - msz - 3);
- p[sz - msz - 1] = 0;
- memcpy(p + sz - msz, m, msz);
- x = mp_loadb(MP_NEW, p, sz);
- x = rsa_decrypt(&rp, x, x, &rand_global);
- mp_storeb(x, p, sz);
- d->len += sz;
- mp_drop(x);
+ rsa_privcreate(&rpc, &rp, &rand_global);
+ if (rsa_sign(&rpc, m, msz, d, pkcs1_sigencode, &pk) < 0)
+ die(EXIT_FAILURE, "internal error in rsasign (key too small?)");
+ rsa_privdestroy(&rpc);
key_fetchdone(kp);
return (0);
}
const void *s, size_t ssz)
{
rsa_pub rp;
+ rsa_pubctx rpc;
+ pkcs1 pk = { 0, 0, 0 };
key_packstruct ks[RSA_PUBFETCHSZ];
key_packdef *kp;
- octet *p;
- size_t sz;
- mp *x;
- mpmont mm;
int ok = 0;
+ dstr d = DSTR_INIT;
int e;
- int i;
kp = key_fetchinit(rsa_pubfetch, ks, &rp);
if ((e = key_fetch(kp, k)) != 0) {
key_fetchdone(kp);
return (e);
}
- x = mp_loadb(MP_NEW, s, ssz);
- mpmont_create(&mm, rp.n);
- x = mpmont_exp(&mm, x, x, rp.e);
- mpmont_destroy(&mm);
- sz = mp_octets(rp.n);
- p = xmalloc(sz);
- mp_storeb(x, p, sz);
- mp_drop(x);
+ rsa_pubcreate(&rpc, &rp);
+ if (rsa_verify(&rpc, s, ssz, &d, pkcs1_sigdecode, &pk) > 0 &&
+ msz == d.len && memcmp(d.buf, m, msz) == 0)
+ ok = 1;
+ dstr_destroy(&d);
+ rsa_pubdestroy(&rpc);
key_fetchdone(kp);
- if (msz + 11 >= sz || p[0] != 0 || p[1] != 1 || p[sz - msz - 1] != 0)
- goto done;
- for (i = 2; i < sz - msz - 1; i++) {
- if (p[i] != 0xff)
- goto done;
- }
- if (memcmp(m, p + sz - msz, msz) != 0)
- goto done;
- ok = 1;
-done:
- free(p);
return (ok);
}