170 int frnd = open(
"/dev/urandom", O_RDONLY);
171 if (frnd < 0) frnd = open(
"/dev/random", O_RDONLY);
174 ssize_t rs = read(frnd, (
void *) &
r,
sizeof(
int));
177 if (rs ==
sizeof(
int))
return r;
179 printf(
"+++ERROR+++ : aux_rand: neither /dev/urandom nor /dev/random are available or readable!\n");
181 if (gettimeofday(&tv,0) == 0) {
183 memcpy((
void *)&
t1, (
void *)&tv.tv_sec,
sizeof(
int));
184 memcpy((
void *)&t2, (
void *)&tv.tv_usec,
sizeof(
int));
224 if ( *i1-- != *i2-- )
225 return( i1[1] > i2[1] ? 1 : -1 );
237 if ( (
l=
c1->n_len) !=
c2->n_len)
238 return(
l -
c2->n_len);
306 if (!lo && same && !
sum)
332 for (lc=1, ld=0;
l--; lc++) {
356 if (!lo && same && !over) {
384 for (i=
l,mul=0; i; i--) {
408 d->n_len =
n_mult(
n->n_part,
m,
d->n_part,
n->n_len );
422 int l1,l2,ld,lc,
l,i,j;
430 for (i=
l, vp=
id; i--;)
434 for ( p1 = m1->
n_part, i=0; i < l1 ; i++, p1++) {
439 for ( p2 = m2->
n_part, j = l2; j--;) {
449 for (lc=0, vp=
id, p1=
d->n_part; lc++ <
l;) {
450 if ( (*p1++ = *vp++))
495 for (;
l >= 0; ld++, i1--, i1e--,
l--, i3--) {
498 if (ld == l2 && ! *i1e) {
503 if ( ld > l2 || (ld == l2 &&
n_cmp( i1, z2->
n_part, l2) >= 0) ) {
507 if ( ld > (l2t= z2[pw].n_len)
509 &&
n_cmp( i1, z2[pw].n_part, ld) >= 0)) {
510 ld =
n_sub( i1, z2[pw].n_part, i1, ld, l2t );
527 if (
lq>0 && !
q->n_part[
lq -1])
548 for (i=1,z=2; i < rsa_MAXBIT; i++, z *= 2)
562#if rsa_MAXBIT == rsa_LOWBITS
588 if ( (i=
n->n_len) &&
n->n_part[i-1] == 0 )
627 for (i=0,z=1; i < rsa_MAXBIT; i++, z *= 2)
656 while ( ! (nt.
n_part[0] & 1)) {
676 if (
a_cmp( &t[at], &t[bt]) < 0) {
677 tmp= at; at= bt; bt= tmp;
680 while ( t[bt].n_len) {
682 tmp= at; at= bt; bt= tmp;
703 return(
n->n_part[0] &
m );
803 ret = ((
f == 1) || (
f == 7)) ? 1 : -1;
852 ret *=
jak_f( &t[nt] );
857 if ( t[at].n_part[0] & 1) {
860 ret *=
jak_g( &t[at], &t[nt] );
862 tmp = at; at = nt; nt = tmp;
865 ret *=
jak_f( &t[nt] );
900 for (; w &&
m;
m--) {
903 for (i=
n->n_len-1, p=
a.n_part; i; i--)
929 || (
a_cmp( &
a, &n1 ) == 0 && j == -1) )
972 i0=k%3; i1=(k+2)%3; i2=(k+1)%3;
975 m_add( &p[i0], &p[i2], &p[i0] );
976 }
while (
r[i0].n_len);
996 const char *hex =
"0123456789ABCDEF" ;
1001 p=&num[
sizeof(num) -1];
1004 for (
l=len;
l--; p--) {
1010 while (len-- && *p ==
'0')
1018 const char *randdev =
"/dev/urandom";
1022 if ((fd = open(randdev, O_RDONLY)) != -1) {
1023 if (read(fd, &seed,
sizeof(seed))) {;}
1026 seed = (
unsigned int)time(0);
1094 static char hex[] =
"0123456789ABCDEF";
1103 for (i=len; i; i--) {
1105 *ph-- = hex[ (
c >> 4) & 0xF ];
1106 *ph-- = hex[
c & 0xF ];
1116 ph = buf + (i=strlen(buf)) -1;
1118 for (; len; len--) {
1120 c = (strchr( hex, *ph) - hex) << 4;
1126 c |= strchr( hex, *ph) - hex;
int n_cmp(rsa_INT *i1, rsa_INT *i2, int l)
static rsa_NUMBER g_mod_z2[rsa_MAXBIT]
void a_imult(rsa_NUMBER *n, rsa_INT m, rsa_NUMBER *d)
void m_exp(rsa_NUMBER *x, rsa_NUMBER *n, rsa_NUMBER *z)
void a_mult(rsa_NUMBER *m1, rsa_NUMBER *m2, rsa_NUMBER *d)
void a_div2(rsa_NUMBER *n)
int n_sub(rsa_INT *p1, rsa_INT *p2, rsa_INT *p3, int l, int lo)
void m_mult(rsa_NUMBER *m1, rsa_NUMBER *m2, rsa_NUMBER *d)
int a_cmp(rsa_NUMBER *c1, rsa_NUMBER *c2)
void n_div(rsa_NUMBER *d1, rsa_NUMBER *z2, rsa_NUMBER *q, rsa_NUMBER *r)
void a_assign(rsa_NUMBER *d, rsa_NUMBER *s)
static int jak_g(rsa_NUMBER *, rsa_NUMBER *)
void a_ggt(rsa_NUMBER *a, rsa_NUMBER *b, rsa_NUMBER *f)
static int jakobi(rsa_NUMBER *, rsa_NUMBER *)
void gen_number(int len, rsa_NUMBER *n)
void a_sub(rsa_NUMBER *s1, rsa_NUMBER *s2, rsa_NUMBER *d)
void a_div(rsa_NUMBER *d1, rsa_NUMBER *d2, rsa_NUMBER *q, rsa_NUMBER *r)
void do_crypt(char *s, char *d, int len, rsa_NUMBER *e)
void a_add(rsa_NUMBER *s1, rsa_NUMBER *s2, rsa_NUMBER *d)
int n_mult(rsa_INT *n, rsa_INT m, rsa_INT *d, int l)
void m_add(rsa_NUMBER *s1, rsa_NUMBER *s2, rsa_NUMBER *d)
static int aux_rand()
rand() implementation using /udev/random or /dev/random, if available
static int jak_f(rsa_NUMBER *)
int n_bits(rsa_NUMBER *n, int b)
void m_init(rsa_NUMBER *n, rsa_NUMBER *o)
void inv(rsa_NUMBER *d, rsa_NUMBER *phi, rsa_NUMBER *e)
int n_bitlen(rsa_NUMBER *n)
int p_prim(rsa_NUMBER *n, int m)
int rsa_num_sget(rsa_NUMBER *, char *)
int rsa_num_sput(rsa_NUMBER *, char *, int)
rsa_INT n_part[rsa_MAXLEN]
static uint64_t sum(uint64_t i)