summaryrefslogtreecommitdiff
path: root/libinterp/ipint.c
diff options
context:
space:
mode:
authorforsyth <forsyth@vitanuova.com>2010-08-10 23:06:28 +0100
committerforsyth <forsyth@vitanuova.com>2010-08-10 23:06:28 +0100
commit7de2b42d50e3c05cc143e7b51284009b5e185581 (patch)
tree42fffe0c9804551c120ef89c3f505059bbd31cfb /libinterp/ipint.c
parent99c84fef96ccd10bb6cabb823384c033090293e9 (diff)
20100810-2306
Diffstat (limited to 'libinterp/ipint.c')
-rw-r--r--libinterp/ipint.c150
1 files changed, 142 insertions, 8 deletions
diff --git a/libinterp/ipint.c b/libinterp/ipint.c
index b4967843..5728420c 100644
--- a/libinterp/ipint.c
+++ b/libinterp/ipint.c
@@ -6,13 +6,39 @@
#include <mp.h>
#include <libsec.h>
#include "pool.h"
-#include "../libkeyring/keys.h"
+#include "ipint.h"
#include "raise.h"
-extern Type *TIPint;
+#include "ipintsmod.h"
+
+enum
+{
+ MaxBigBytes = 1024
+};
+
+/* infinite precision integer */
+struct IPint
+{
+ IPints_IPint x;
+ mpint* b;
+};
+
+Type *TIPint;
+static uchar IPintmap[] = IPints_IPint_map;
+
#define MP(x) checkIPint((x))
-Keyring_IPint*
+void
+ipintsmodinit(void)
+{
+ /* can be called from modinit, Keyring or Crypt */
+ if(TIPint == nil)
+ TIPint = dtype(freeIPint, sizeof(IPint), IPintmap, sizeof(IPintmap));
+ builtinmod("$IPints", IPintsmodtab, IPintsmodlen);
+}
+
+//IPints_IPint*
+void*
newIPint(mpint* b)
{
Heap *h;
@@ -23,20 +49,22 @@ newIPint(mpint* b)
h = heap(TIPint); /* TO DO: caller might lose other values if heap raises error here */
ip = H2D(IPint*, h);
ip->b = b;
- return (Keyring_IPint*)ip;
+ return (IPints_IPint*)ip;
}
mpint*
-checkIPint(Keyring_IPint *v)
+checkIPint(void *a)
{
+ IPints_IPint *v;
IPint *ip;
+ v = a;
ip = (IPint*)v;
if(ip == H || ip == nil)
error(exNilref);
if(D2H(ip)->t != TIPint)
error(exType);
- return ip->b;
+ return ip->b; /* non-nil by construction */
}
void
@@ -151,7 +179,7 @@ IPint_iptostr(void *fp)
retstr(buf, f->ret);
}
-static Keyring_IPint*
+static IPints_IPint*
strtoipint(String *s, int base)
{
char *p, *q;
@@ -250,7 +278,7 @@ IPint_random(void *fp)
destroy(v);
release();
- b = mprand(f->maxbits, genrandom, nil);
+ b = mprand(f->nbits, genrandom, nil);
acquire();
*f->ret = newIPint(b);
}
@@ -712,3 +740,109 @@ IPint_not(void *fp)
mpnot(i1, ret);
*f->ret = newIPint(ret);
}
+
+/*
+ * primes
+ */
+
+void
+IPints_probably_prime(void *fp)
+{
+ F_IPints_probably_prime *f;
+
+ f = fp;
+ release();
+ *f->ret = probably_prime(checkIPint(f->n), f->nrep);
+ acquire();
+}
+
+void
+IPints_genprime(void *fp)
+{
+ F_IPints_genprime *f;
+ mpint *p;
+ void *r;
+
+ f = fp;
+ r = *f->ret;
+ *f->ret = H;
+ destroy(r);
+ p = mpnew(0);
+ release();
+ genprime(p, f->nbits, f->nrep);
+ acquire();
+ *f->ret = newIPint(p);
+}
+
+void
+IPints_genstrongprime(void *fp)
+{
+ F_IPints_genstrongprime *f;
+ mpint *p;
+ void *r;
+
+ f = fp;
+ r = *f->ret;
+ *f->ret = H;
+ destroy(r);
+ p = mpnew(0);
+ release();
+ genstrongprime(p, f->nbits, f->nrep);
+ acquire();
+ *f->ret = newIPint(p);
+}
+
+void
+IPints_gensafeprime(void *fp)
+{
+ F_IPints_gensafeprime *f;
+ mpint *p, *alpha;
+ void *v;
+
+ f = fp;
+ v = f->ret->t0;
+ f->ret->t0 = H;
+ destroy(v);
+ v = f->ret->t1;
+ f->ret->t1 = H;
+ destroy(v);
+
+ p = mpnew(0);
+ alpha = mpnew(0);
+ release();
+ gensafeprime(p, alpha, f->nbits, f->nrep);
+ acquire();
+ f->ret->t0 = newIPint(p);
+ f->ret->t1 = newIPint(alpha);
+}
+
+void
+IPints_DSAprimes(void *fp)
+{
+ F_IPints_DSAprimes *f;
+ mpint *p, *q;
+ Heap *h;
+ void *v;
+
+ f = fp;
+ v = f->ret->t0;
+ f->ret->t0 = H;
+ destroy(v);
+ v = f->ret->t1;
+ f->ret->t1 = H;
+ destroy(v);
+ v = f->ret->t2;
+ f->ret->t2 = H;
+ destroy(v);
+
+ h = heaparray(&Tbyte, SHA1dlen);
+ f->ret->t2 = H2D(Array*, h);
+
+ p = mpnew(0);
+ q = mpnew(0);
+ release();
+ DSAprimes(q, p, f->ret->t2->data);
+ acquire();
+ f->ret->t0 = newIPint(q);
+ f->ret->t1 = newIPint(p);
+}