# ---?---
#
-# $Id: misc.xs,v 1.2 2004/04/08 01:36:21 mdw Exp $
+# $Id$
#
# Miscellaneous function interfaces
#
# along with Catacomb/Perl; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+MODULE = Catacomb PACKAGE = Catacomb::Share::GF PREFIX = gfshare_
+
+Share_GF *
+new(me, t, sz)
+ SV *me
+ UV t
+ UV sz
+ CODE:
+ RETVAL = CREATE(Share_GF);
+ if (t < 1 || t > 255)
+ croak("share threshhold out of range");
+ gfshare_create(RETVAL, t, sz);
+ OUTPUT:
+ RETVAL
+
+UV
+sz(s)
+ Share_GF *s
+ CODE:
+ RETVAL = s->sz;
+ OUTPUT:
+ RETVAL
+
+UV
+t(s)
+ Share_GF *s
+ CODE:
+ RETVAL = s->t;
+ OUTPUT:
+ RETVAL
+
+UV
+i(s)
+ Share_GF *s
+ CODE:
+ RETVAL = s->i;
+ OUTPUT:
+ RETVAL
+
+SV *
+DESTROY(s)
+ Share_GF *s
+ CODE:
+ gfshare_destroy(s);
+ DESTROY(s);
+ XSRETURN_YES;
+
+SV *
+mkshares(s, x, r = &rand_global)
+ Share_GF *s
+ SV *x
+ grand *r
+ PREINIT:
+ char *p;
+ STRLEN len;
+ CODE:
+ p = SvPV(x, len);
+ if (len != s->sz)
+ croak("secret length mismatch");
+ gfshare_mkshares(s, r, p);
+ s->i = ~0u;
+ XSRETURN_YES;
+
+SV *
+get(s, i)
+ Share_GF *s
+ UV i
+ CODE:
+ if (i >= 255)
+ croak("share index out of range");
+ if (s->i != ~0u)
+ croak("not making shares");
+ RETVAL = NEWSV(0, s->sz);
+ SvPOK_on(RETVAL);
+ gfshare_get(s, i, SvPVX(RETVAL));
+ SvCUR_set(RETVAL, s->sz);
+ OUTPUT:
+ RETVAL
+
+unsigned
+add(s, i, x)
+ Share_GF *s
+ UV i
+ SV *x
+ PREINIT:
+ char *p;
+ STRLEN len;
+ CODE:
+ p = SvPV(x, len);
+ if (len != s->sz)
+ croak("secret length mismatch");
+ if (i == ~0u)
+ croak("making shares");
+ if (i >= 255)
+ croak("share index out of range");
+ if (s->i >= s->t)
+ croak("too many shares");
+ RETVAL = gfshare_add(s, i, p);
+ OUTPUT:
+ RETVAL
+
+SV *
+combine(s)
+ Share_GF *s
+ CODE:
+ if (s->i == ~0u)
+ croak("making shares");
+ if (s->i != s->t)
+ croak("not enough shares yet");
+ RETVAL = NEWSV(0, s->sz);
+ SvPOK_on(RETVAL);
+ gfshare_combine(s, SvPVX(RETVAL));
+ SvCUR_set(RETVAL, s->sz);
+ OUTPUT:
+ RETVAL
+
+MODULE = Catacomb PACKAGE = Catacomb::Share::Prime PREFIX = share_
+
+Share_Prime *
+new(me, t, p = &PL_sv_undef)
+ SV *me
+ UV t
+ SV *p
+ CODE:
+ RETVAL = CREATE(Share_Prime);
+ if (t < 1 || t > MPW_MAX)
+ croak("share threshhold out of range");
+ share_create(RETVAL, t);
+ if (SvOK(p))
+ RETVAL->p = mp_fromsv(p, "p", 0, 1);
+ OUTPUT:
+ RETVAL
+
+mp *
+p(s)
+ Share_Prime *s
+ CODE:
+ if (!s->p)
+ XSRETURN_UNDEF;
+ RETVAL = MP_COPY(s->p);
+ OUTPUT:
+ RETVAL
+
+UV
+t(s)
+ Share_Prime *s
+ CODE:
+ RETVAL = s->t;
+ OUTPUT:
+ RETVAL
+
+UV
+i(s)
+ Share_Prime *s
+ CODE:
+ RETVAL = s->i;
+ OUTPUT:
+ RETVAL
+
+SV *
+DESTROY(s)
+ Share_Prime *s
+ CODE:
+ share_destroy(s);
+ DESTROY(s);
+ XSRETURN_YES;
+
+SV *
+mkshares(s, x, r = &rand_global)
+ Share_Prime *s
+ mp *x
+ grand *r
+ CODE:
+ if (s->p && MP_CMP(s->p, <=, x))
+ croak("secret out of range");
+ share_mkshares(s, r, x);
+ s->i = ~0u;
+ XSRETURN_YES;
+
+mp *
+share_get(s, i)
+ Share_Prime *s
+ UV i
+ INIT:
+ if (i >= MPW_MAX)
+ croak("share index out of range");
+ if (s->i != ~0u)
+ croak("not making shares");
+ C_ARGS:
+ s, MP_NEW, i
+
+unsigned
+share_add(s, i, x)
+ Share_Prime *s
+ UV i
+ mp *x
+ INIT:
+ if (!s->p)
+ croak("no prime set");
+ if (i == ~0u)
+ croak("making shares");
+ if (i >= MPW_MAX)
+ croak("share index out of range");
+ if (s->i >= s->t)
+ croak("too many shares");
+ C_ARGS:
+ s, i, x
+
+mp *
+share_combine(s)
+ Share_Prime *s
+ INIT:
+ if (s->i == ~0u)
+ croak("making shares");
+ if (s->i != s->t)
+ croak("not enough shares yet");
+
MODULE = Catacomb PACKAGE = Catacomb::Passphrase
SV *
char *tag
CODE:
passphrase_cancel(tag);
- XSRETURN_UNDEF;
+ XSRETURN_YES;
MODULE = Catacomb PACKAGE = Catacomb::KeySize
OUTPUT:
RETVAL
+void
+expand(ksz)
+ keysize *ksz
+ PREINIT:
+ int i;
+ PPCODE:
+ switch (ksz[0]) {
+ case KSZ_ANY:
+ XPUSHs(sv_2mortal(newSVpv("ANY", 0)));
+ XPUSHs(sv_2mortal(newSViv(ksz[1])));
+ break;
+ case KSZ_RANGE:
+ XPUSHs(sv_2mortal(newSVpv("RANGE", 0)));
+ for (i = 1; i < 5; i++)
+ XPUSHs(sv_2mortal(newSViv(ksz[i])));
+ break;
+ case KSZ_SET:
+ XPUSHs(sv_2mortal(newSVpv("SET", 0)));
+ for (i = 1; ksz[i]; i++)
+ XPUSHs(sv_2mortal(newSViv(ksz[i])));
+ break;
+ default:
+ abort();
+ }
+
#----- That's all, folks ----------------------------------------------------