X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb-perl/blobdiff_plain/f9952aec1cf6c64a5681308eea817b6113a37433..fcd15e0b7a3d0f0ca2f30953573f8d1f6b8e8bd2:/misc.xs diff --git a/misc.xs b/misc.xs index e7484dd..d0eb19d 100644 --- a/misc.xs +++ b/misc.xs @@ -1,6 +1,6 @@ # ---?--- # -# $Id: misc.xs,v 1.2 2004/04/08 01:36:21 mdw Exp $ +# $Id$ # # Miscellaneous function interfaces # @@ -25,6 +25,223 @@ # 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 * @@ -61,7 +278,7 @@ cancel(me, tag) char *tag CODE: passphrase_cancel(tag); - XSRETURN_UNDEF; + XSRETURN_YES; MODULE = Catacomb PACKAGE = Catacomb::KeySize @@ -74,4 +291,29 @@ keysz(ksz, sz) 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 ----------------------------------------------------