5 # Key-management interface
7 # (c) 2001 Straylight/Edgeware
10 #----- Licensing notice -----------------------------------------------------
12 # This file is part of the Perl interface to Catacomb.
14 # Catacomb/Perl is free software; you can redistribute it and/or modify
15 # it under the terms of the GNU General Public License as published by
16 # the Free Software Foundation; either version 2 of the License, or
17 # (at your option) any later version.
19 # Catacomb/Perl is distributed in the hope that it will be useful,
20 # but WITHOUT ANY WARRANTY; without even the implied warranty of
21 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 # GNU General Public License for more details.
24 # You should have received a copy of the GNU General Public License
25 # along with Catacomb/Perl; if not, write to the Free Software Foundation,
26 # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
28 MODULE = Catacomb PACKAGE = Catacomb::PubKey
31 gen_dh(me, ql, pl, steps = 0, r = &rand_global, events = &PL_sv_undef)
37 MP_Prime_Gen_NullProc *events
43 pgproc_get(events, &evproc, &evctx);
44 if (dh_gen(&dp, ql, pl, steps, r, evproc, evctx))
51 gen_limlee(me, ql, pl, flags = 0, steps = 0, r = &rand_global, oevents = &PL_sv_undef, ievents = &PL_sv_undef)
58 MP_Prime_Gen_NullProc *oevents
59 MP_Prime_Gen_NullProc *ievents
68 pgproc_get(oevents, &oev, &oec);
69 pgproc_get(ievents, &iev, &iec);
70 if (dh_limlee(&dp, ql, pl, flags, steps, r,
71 oev, oec, iev, iec, &nf, &f))
76 for (i = 0; i < nf; i++)
81 gen_dsa(me, ql, pl, steps = 0, k = &PL_sv_undef, events = &PL_sv_undef)
87 MP_Prime_Gen_NullProc *events
102 rand_get(RAND_GLOBAL, kp, ksz);
104 pgproc_get(events, &evproc, &evctx);
105 if (dsa_gen(&dp, ql, pl, steps, kp, ksz, &ds, evproc, evctx))
107 XPUSHs(RET_MP(dp.p));
108 XPUSHs(RET_MP(dp.g));
109 XPUSHs(RET_MP(dp.q));
110 XPUSHs(sv_2mortal(newSVpvn((char *)ds.p, ds.sz)));
111 XPUSHs(sv_2mortal(newSViv(ds.count)));
114 MODULE = Catacomb PACKAGE = Catacomb::DSA
122 gdsa_pubfromsv(&g, c);
123 RETVAL = gdsa_beginhash(&g);
134 gdsa_pubfromsv(&g, c);
138 MODULE = Catacomb PACKAGE = Catacomb::DSA::Private
147 gdsa_sig s = GDSA_SIG_INIT;
151 gdsa_privfromsv(&g, c);
153 if (len != g.h->hashsz)
154 croak("bad message length");
155 gdsa_sign(&g, &s, p, k);
156 XPUSHs(MAKE_MP(s.r));
157 XPUSHs(MAKE_MP(s.s));
159 MODULE = Catacomb PACKAGE = Catacomb::DSA::Public
169 gdsa_sig ss = GDSA_SIG_INIT;
173 gdsa_pubfromsv(&g, c);
175 if (len != g.h->hashsz)
176 croak("bad message length");
179 RETVAL = !gdsa_verify(&g, &ss, p);
183 MODULE = Catacomb PACKAGE = Catacomb::KCDSA
191 gdsa_pubfromsv(&g, c);
192 RETVAL = gkcdsa_beginhash(&g);
203 gdsa_pubfromsv(&g, c);
204 gkcdsa_endhash(&g, h);
207 MODULE = Catacomb PACKAGE = Catacomb::KCDSA::Private
216 gkcdsa_sig s = GKCDSA_SIG_INIT;
220 gdsa_privfromsv(&g, c);
222 if (len != g.h->hashsz)
223 croak("bad message length");
224 gkcdsa_sign(&g, &s, p, k);
225 XPUSHs(sv_2mortal(newSVpvn((char *)s.r, g.h->hashsz)));
229 MODULE = Catacomb PACKAGE = Catacomb::KCDSA::Public
239 gkcdsa_sig ss = GKCDSA_SIG_INIT;
243 gdsa_pubfromsv(&g, c);
245 if (len != g.h->hashsz)
246 croak("bad message length");
247 ss.r = (void *)SvPV(r, len);
248 if (len != g.h->hashsz)
249 croak("bad signature (r) length");
251 RETVAL = !gkcdsa_verify(&g, &ss, p);
255 MODULE = Catacomb PACKAGE = Catacomb::RSA::Public PREFIX = rsa_
265 rp = CREATE(rsa_pub);
267 rp->n = C_MP(&c, "n");
268 rp->e = C_MP(&c, "e");
269 RETVAL = CREATE(rsa_pubctx);
270 rsa_pubcreate(RETVAL, rp);
278 RETVAL = MP_COPY(rp->rp->n);
287 hvput(RETVAL, "n", MAKE_MP(rp->rp->n));
288 hvput(RETVAL, "e", MAKE_MP(rp->rp->e));
310 RETVAL = rsa_pubop(rp, MP_NEW, p);
314 MODULE = Catacomb PACKAGE = Catacomb::RSA::Private PREFIX = rsa_
325 rp = CREATE(rsa_priv);
326 rp->n = C_MP(&c, "n");
327 rp->e = C_MP(&c, "e");
328 rp->d = C_MP(&c, "d");
329 rp->p = C_MP(&c, "p");
330 rp->q = C_MP(&c, "q");
331 rp->dp = C_MP(&c, "dp");
332 rp->dq = C_MP(&c, "dq");
333 rp->q_inv = C_MP(&c, "qi");
335 croak("insuffcient values in Catacomb::RSA::Private::new");
336 RETVAL = CREATE(rsa_privctx);
337 rsa_privcreate(RETVAL, rp, &rand_global);
342 generate(me, nbits, r = &rand_global, n = 0, events = &PL_sv_undef)
347 MP_Prime_Gen_NullProc *events
353 rp = CREATE(rsa_priv);
354 pgproc_get(events, &ev, &ec);
355 if (rsa_gen(rp, nbits, r, n, ev, ec)) {
359 RETVAL = CREATE(rsa_privctx);
360 rsa_privcreate(RETVAL, rp, &rand_global);
369 hvput(RETVAL, "n", MAKE_MP(rp->rp->n));
370 hvput(RETVAL, "e", MAKE_MP(rp->rp->e));
371 hvput(RETVAL, "d", MAKE_MP(rp->rp->d));
372 hvput(RETVAL, "p", MAKE_MP(rp->rp->p));
373 hvput(RETVAL, "q", MAKE_MP(rp->rp->q));
374 hvput(RETVAL, "dp", MAKE_MP(rp->rp->dp));
375 hvput(RETVAL, "dq", MAKE_MP(rp->rp->dq));
376 hvput(RETVAL, "qi", MAKE_MP(rp->rp->q_inv));
384 RETVAL = MP_COPY(rp->rp->n);
394 rp->r = &rand_global;
403 op(rp, p, r = &PL_sv_undef)
408 rp->r = SvOK(r) ? ptrfromsv(r, "Catacomb::Rand", "r") : 0;
409 RETVAL = rsa_privop(rp, MP_NEW, p);
413 MODULE = Catacomb PACKAGE = Catacomb::RSA::PKCS1Crypt
427 pkcs1_fromsv(&pc, c);
430 RETVAL = pkcs1_cryptencode(MP_NEW, mm, msz, b, sz, nbits, &pc);
436 unpad(c, m, sz, nbits)
446 pkcs1_fromsv(&pc, c);
448 rc = pkcs1_cryptdecode(m, b, sz, nbits, &pc);
450 RETVAL = &PL_sv_undef;
452 RETVAL = newSVpvn(b, rc);
457 MODULE = Catacomb PACKAGE = Catacomb::RSA::PKCS1Sign
471 pkcs1_fromsv(&pc, c);
474 RETVAL = pkcs1_sigencode(MP_NEW, mm, msz, b, sz, nbits, &pc);
480 unpad(c, s, m, sz, nbits)
493 pkcs1_fromsv(&pc, c);
496 rc = pkcs1_sigdecode(s, mm, msz, b, sz, nbits, &pc);
497 if (rc < 0) XSRETURN_UNDEF;
498 RETVAL = newSVpvn(b, rc);
503 MODULE = Catacomb PACKAGE = Catacomb::RSA::OAEP
520 RETVAL = oaep_encode(MP_NEW, mm, msz, b, sz, nbits, &pc);
526 unpad(c, m, sz, nbits)
538 rc = oaep_decode(m, b, sz, nbits, &pc);
540 RETVAL = &PL_sv_undef;
542 RETVAL = newSVpvn(b, rc);
547 MODULE = Catacomb PACKAGE = Catacomb::RSA::PSS
564 RETVAL = pss_encode(MP_NEW, mm, msz, b, sz, nbits, &pc);
570 unpad(c, s, m, sz, nbits)
586 rc = pss_decode(s, mm, msz, b, sz, nbits, &pc);
587 if (rc < 0) XSRETURN_UNDEF;
588 RETVAL = newSVpvn(b, rc);
593 #----- That's all, folks ----------------------------------------------------