37 #include <sys/types.h>
46 # include <sys/time.h>
167 static int aux_rand()
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));
218 int n_cmp(rsa_INT *i1, rsa_INT *i2,
int l)
224 if ( *i1-- != *i2-- )
225 return( i1[1] > i2[1] ? 1 : -1 );
233 int a_cmp(rsa_NUMBER *c1, rsa_NUMBER *c2)
237 if ( (l=c1->n_len) != c2->n_len)
238 return( l - c2->n_len);
241 return( n_cmp( c1->n_part, c2->n_part, l) );
247 void a_assign(rsa_NUMBER *d, rsa_NUMBER *s)
255 memcpy( d->n_part, s->n_part,
sizeof(rsa_INT)*l);
263 void a_add(rsa_NUMBER *s1, rsa_NUMBER *s2, rsa_NUMBER *d)
272 if ( (l=s1->n_len) < s2->n_len) {
273 rsa_NUMBER *tmp = s1;
297 sum += (rsa_LONG)*p1++ + (rsa_LONG)b;
298 *p3++ = rsa_TOINT(sum);
300 if (sum > (rsa_LONG)rsa_MAXINT) {
306 if (!lo && same && !sum)
323 int n_sub(rsa_INT *p1, rsa_INT *p2, rsa_INT *p3,
int l,
int lo)
332 for (lc=1, ld=0; l--; lc++) {
345 dif = (rsa_MAXINT +1) + a;
352 *p3++ = (rsa_INT)dif;
356 if (!lo && same && !over) {
369 void a_sub(rsa_NUMBER *s1, rsa_NUMBER *s2, rsa_NUMBER *d)
371 d->n_len = n_sub( s1->n_part, s2->n_part, d->n_part
372 ,s1->n_len, s2->n_len );
379 int n_mult(rsa_INT *n, rsa_INT m, rsa_INT *d,
int l)
384 for (i=l,mul=0; i; i--) {
385 mul += (rsa_LONG)m * (rsa_LONG)*n++;
386 *d++ = rsa_TOINT(mul);
387 mul = rsa_DIVMAX1( mul );
401 void a_imult(rsa_NUMBER *n, rsa_INT m, rsa_NUMBER *d)
408 d->n_len = n_mult( n->n_part, m, d->n_part, n->n_len );
414 void a_mult(rsa_NUMBER *m1, rsa_NUMBER *m2, rsa_NUMBER *d)
416 static rsa_INT
id[ rsa_MAXLEN ];
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--;) {
440 sum += (rsa_LONG)*vp + (tp1 * (rsa_LONG)*p2++);
441 *vp++ = rsa_TOINT( sum );
442 sum = rsa_DIVMAX1(sum);
444 *vp++ += (rsa_INT)sum;
449 for (lc=0, vp=
id, p1=d->n_part; lc++ < l;) {
450 if ( (*p1++ = *vp++))
464 void n_div(rsa_NUMBER *d1, rsa_NUMBER *z2, rsa_NUMBER *q, rsa_NUMBER *r)
466 static rsa_NUMBER dummy_rest;
467 static rsa_NUMBER dummy_quot;
468 rsa_INT *i1,*i1e,*i3;
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) ) {
506 for (pw=rsa_MAXBIT-1, z=(rsa_INT)rsa_HIGHBIT; pw >= 0; pw--, z /= 2) {
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 );
516 ld = n_sub( i1, z2->n_part, i1, ld, l2 );
527 if (lq>0 && !q->n_part[lq -1])
540 void a_div(rsa_NUMBER *d1, rsa_NUMBER *d2, rsa_NUMBER *q, rsa_NUMBER *r)
543 rsa_NUMBER z2[rsa_MAXBIT];
547 a_assign( &z2[0], d2 );
548 for (i=1,z=2; i < rsa_MAXBIT; i++, z *= 2)
549 a_imult( d2, z, &z2[i] );
554 n_div( d1, d2, q, r );
560 void a_div2(rsa_NUMBER *n)
562 #if rsa_MAXBIT == rsa_LOWBITS
588 if ( (i= n->n_len) && n->n_part[i-1] == 0 )
602 a_div( n, &a_two, n, rsa_NUM0P );
611 static rsa_NUMBER g_mod_z2[ rsa_MAXBIT ];
616 void m_init(rsa_NUMBER *n, rsa_NUMBER *o)
622 a_assign( o, &g_mod_z2[0] );
624 if (! a_cmp( n, &g_mod_z2[0]) )
627 for (i=0,z=1; i < rsa_MAXBIT; i++, z *= 2)
628 a_imult( n, z, &g_mod_z2[i] );
631 void m_add(rsa_NUMBER *s1, rsa_NUMBER *s2, rsa_NUMBER *d)
634 if (a_cmp( d, g_mod_z2) >= 0)
635 a_sub( d, g_mod_z2, d );
638 void m_mult(rsa_NUMBER *m1, rsa_NUMBER *m2, rsa_NUMBER *d)
641 n_div( d, g_mod_z2, rsa_NUM0P, d );
647 void m_exp(rsa_NUMBER *x, rsa_NUMBER *n, rsa_NUMBER *z)
653 a_assign( z, &a_one );
656 while ( ! (nt.n_part[0] & 1)) {
657 m_mult( &xt, &xt, &xt );
661 a_sub( &nt, &a_one, &nt );
668 void a_ggt(rsa_NUMBER *a, rsa_NUMBER *b, rsa_NUMBER *f)
673 a_assign( &t[0], a ); at= 0;
674 a_assign( &t[1], b ); bt= 1;
676 if ( a_cmp( &t[at], &t[bt]) < 0) {
677 tmp= at; at= bt; bt= tmp;
680 while ( t[bt].n_len) {
681 a_div( &t[at], &t[bt], rsa_NUM0P, &t[at] );
682 tmp= at; at= bt; bt= tmp;
685 a_assign( f, &t[at] );
692 int n_bits(rsa_NUMBER *n,
int b)
702 if (rsa_LOWBITS >= b)
703 return( n->n_part[0] & m );
706 l = (b-1) / rsa_LOWBITS;
710 for (p= &n->n_part[l],r=0; l-- >= 0 && b > 0; b-= rsa_LOWBITS, p--) {
711 r = rsa_MULMAX1( r );
721 int n_bitlen(rsa_NUMBER *n)
726 a_assign( &b, &a_one );
728 for (i=0; a_cmp( &b, n) <= 0; a_mult( &b, &a_two, &b ), i++)
790 static int jak_f( rsa_NUMBER* );
791 static int jak_g( rsa_NUMBER*, rsa_NUMBER* );
792 static int jakobi( rsa_NUMBER*, rsa_NUMBER* );
797 static int jak_f(rsa_NUMBER *n)
803 ret = ((f == 1) || (f == 7)) ? 1 : -1;
811 static int jak_g(rsa_NUMBER *a, rsa_NUMBER *n)
815 if ( n_bits( n, 2) == 1 ||
827 static int jakobi(rsa_NUMBER *a, rsa_NUMBER *n)
832 a_assign( &t[0], a ); at = 0;
833 a_assign( &t[1], n ); nt = 1;
848 if (! a_cmp(&t[at],&a_one)) {
851 if (! a_cmp(&t[at],&a_two)) {
852 ret *= jak_f( &t[nt] );
857 if ( t[at].n_part[0] & 1) {
860 ret *= jak_g( &t[at], &t[nt] );
861 a_div( &t[nt], &t[at], rsa_NUM0P, &t[nt] );
862 tmp = at; at = nt; nt = tmp;
865 ret *= jak_f( &t[nt] );
884 int p_prim(rsa_NUMBER *n,
int m)
886 rsa_NUMBER gt,n1,n2,a;
890 if (a_cmp(n,&a_two) <= 0 || m <= 0)
893 a_sub( n, &a_one, &n1 );
894 a_assign( &n2, &n1 );
897 m_init( n, rsa_NUM0P );
900 for (; w && m; m--) {
903 for (i=n->n_len-1, p=a.n_part; i; i--)
904 *p++ = (rsa_INT)aux_rand();
906 *p = (rsa_INT)( aux_rand() % ((
unsigned long)n->n_part[i-1] +1) );
910 }
while ( a_cmp( &a, n) >= 0 || a_cmp( &a, &a_two) < 0 );
923 if ( a_cmp( >, &a_one) == 0) {
926 m_exp( &a, &n2, &a );
928 if ( ( a_cmp( &a, &a_one) == 0 && j == 1 )
929 || ( a_cmp( &a, &n1 ) == 0 && j == -1) )
949 void inv(rsa_NUMBER *d, rsa_NUMBER *phi, rsa_NUMBER *e)
952 rsa_NUMBER r[3],p[3],c;
959 if (a_cmp(phi,d) <= 0)
962 m_init( phi, rsa_NUM0P );
965 a_assign( &p[2], &a_one );
966 a_assign( &r[1], phi );
967 a_assign( &r[2], d );
972 i0=k%3; i1=(k+2)%3; i2=(k+1)%3;
973 a_div( &r[i2], &r[i1], &c, &r[i0] );
974 m_mult( &c, &p[i1], &p[i0] );
975 m_add( &p[i0], &p[i2], &p[i0] );
976 }
while (r[i0].n_len);
978 if ( a_cmp( &r[i1], &a_one) )
982 a_sub( phi, &p[i1], e );
984 a_assign( e, &p[i1] );
994 void gen_number(
int len, rsa_NUMBER *n)
996 const char *hex =
"0123456789ABCDEF" ;
997 char num[ rsa_STRLEN +1 ];
1001 p=&num[
sizeof(num) -1];
1004 for (l=len; l--; p--) {
1005 i = aux_rand() % 16;
1010 while (len-- && *p ==
'0')
1013 rsa_num_sget( n, p );
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);
1092 void do_crypt(
char *s,
char *d,
int len, rsa_NUMBER *e)
1094 static char hex[] =
"0123456789ABCDEF";
1096 char buf[ rsa_STRLEN + 1 ];
1100 ph = buf + rsa_STRLEN - 1;
1103 for (i=len; i; i--) {
1105 *ph-- = hex[ (c >> 4) & 0xF ];
1106 *ph-- = hex[ c & 0xF ];
1110 rsa_num_sget( &n, ph );
1114 rsa_num_sput( &n, buf, rsa_STRLEN +1 );
1116 ph = buf + (i=strlen(buf)) -1;
1118 for (; len; len--) {
1120 c = (strchr( hex, *ph) - hex) << 4;
1126 c |= strchr( hex, *ph) - hex;