41 static int g_clear_siz;
48 rsa_NUMBER rsa_genprim(
int len,
int prob)
50 rsa_NUMBER a_three,a_four;
54 a_add( &a_one, &a_two, &a_three );
55 a_add( &a_two, &a_two, &a_four );
62 gen_number( len, &prim );
63 }
while ( !prim.n_len );
65 a_mult( &prim, &a_two, &prim );
66 a_mult( &prim, &a_three, &prim );
67 a_add( &prim, &a_one, &prim );
71 if (p_prim( &prim, prob ))
74 a_add( &prim, &a_four, &prim );
76 a_add( &prim, &a_two, &prim );
82 int rsa_genrsa(rsa_NUMBER p1, rsa_NUMBER p2, rsa_NUMBER *n, rsa_NUMBER *e, rsa_NUMBER *d)
84 rsa_NUMBER phi, *max_p;
88 if ( !a_cmp( &p1, &p2) )
return 1;
90 if (a_cmp( &p1, &p2) > 0)
96 a_mult( &p1, &p2, n );
97 a_sub( &p1, &a_one, &phi );
98 a_sub( &p2, &a_one, e );
99 a_mult( &phi, e, &phi );
101 len = n_bitlen( &phi );
102 len = ( len + 3) / 4;
104 a_assign( &p1, &phi );
105 a_sub( &p1, &a_one, &p1 );
117 gen_number( len, d );
118 }
while (((a_cmp( d, max_p) <= 0 || a_cmp( d, &p1) >= 0)) && jj < kMAXT);
121 }
while ( a_cmp( e, &a_one) && ii < kMAXT);
123 if (ii >= kMAXT || jj >= kMAXT)
132 int rsa_encode_size(rsa_NUMBER n)
136 return ( n_bitlen( &n) + 7) / 8;
139 int rsa_encode(
char *bufin,
int lin, rsa_NUMBER n, rsa_NUMBER e)
145 char buf[ rsa_STRLEN*2 ];
146 char bufout[ rsa_STRLEN*2 ];
150 g_enc_siz = ( n_bitlen( &n) + 7) / 8;
151 g_clear_siz = g_enc_siz -1;
152 m_init( &n, rsa_NUM0P );
156 for ( i = 0; i < lin; i += g_clear_siz) {
158 memcpy(buf,bufin+i,g_clear_siz);
160 j = ((lin-i) < g_clear_siz) ? lin-i : g_clear_siz;
161 memset(buf+j,0,(g_enc_siz-j));
163 do_crypt( buf, buf, g_enc_siz, &e );
165 memcpy(pout,buf,g_enc_siz);
171 memcpy(bufin,bufout,lout);
177 int rsa_decode(
char *bufin,
int lin, rsa_NUMBER n, rsa_NUMBER e)
183 char buf[ rsa_STRLEN*2 ];
184 char bufout[ rsa_STRLEN*2 ];
188 g_enc_siz = ( n_bitlen( &n) + 7) / 8;
189 g_clear_siz = g_enc_siz -1;
190 m_init( &n, rsa_NUM0P );
194 for ( i = 0; i < lin; i += g_enc_siz) {
196 memcpy(buf,bufin+i,g_enc_siz);
198 do_crypt( buf, buf, g_enc_siz, &e );
200 memcpy(pout,buf,g_clear_siz);
206 memcpy(bufin,bufout,lout);
250 static const char *gHEX=
"0123456789ABCDEF";
251 static const char *ghex=
"0123456789abcdef";
253 static rsa_NUMBER gbits[9];
254 static rsa_NUMBER gint16[16];
256 static int ginit = 0;
264 a_assign( &gbits[0], &a_one );
266 a_add( &gbits[i-1], &gbits[i-1], &gbits[i] );
268 a_assign( &gint16[0], &a_one );
269 for ( i=1; i<16; i++)
270 a_add( &gint16[i-1], &a_one, &gint16[i] );
276 int rsa_num_sput(rsa_NUMBER *n,
char *s,
int l)
278 #if rsa_MAXINT == ( (1 << rsa_MAXBIT) - 1 )
284 bi = rsa_MAXBIT * n->n_len;
285 ab = 4 - (bi + 3) % 4 -1;
286 p = &n->n_part[n->n_len -1];
288 if ( (bi+3) / 4 >= l )
294 b |= (
unsigned long)*p--;
299 b &= ( 1L << (ab - 4)) -1L;
315 int i,b,p,len,low,high;
325 for (; q.n_len && len > 1; len --) {
326 a_div( &q, &gbits[4], &q, &r );
327 for (p=8, b=0, i=3; i >= 0; i--, p /= 2) {
328 if ( a_cmp( &r, &gbits[i]) >= 0) {
329 a_sub( &r, &gbits[i], &r );
350 int rsa_num_fput(rsa_NUMBER *n, FILE *f)
354 char n_print[ rsa_STRLEN + 1 ];
356 if ( rsa_num_sput( n, n_print,
sizeof( n_print) ) == EOF )
359 for (j=0, np=n_print; *np ; np++, j++) {
374 int rsa_num_sget(rsa_NUMBER *n,
char *s)
376 #if rsa_MAXINT == ( (1 << rsa_MAXBIT) - 1 )
384 ab = rsa_MAXBIT - (bi + rsa_MAXBIT -1) % rsa_MAXBIT -1;
385 i = (bi + rsa_MAXBIT-1) / rsa_MAXBIT;
386 p = &n->n_part[ i -1 ];
389 if ( i > rsa_MAXLEN )
394 if ( (hp = strchr( gHEX, *s )) )
396 else if ((hp = strchr( ghex, *s )) )
403 b |= (
unsigned long)i;
406 while (ab >= rsa_MAXBIT) {
407 i = (b >> (ab - rsa_MAXBIT));
408 b &= ( 1L << (ab - rsa_MAXBIT)) -1L;
433 while ( (c = *s++ & 0xFF)) {
434 if ( p= strchr( gHEX, c) )
436 else if ( p= strchr( ghex, c) )
441 a_mult( n, &gbits[4], n );
443 a_add( n, &gint16[i-1], n );
450 int rsa_num_fget(rsa_NUMBER *n, FILE *f)
454 char n_print[ rsa_STRLEN + 1 ];
458 while ( (c=getc(f)) != EOF && ( isxdigit(c) || isspace(c)) ) {
470 if ( rsa_num_sget( n, n_print) == EOF )
476 int rsa_cmp(rsa_NUMBER *c1, rsa_NUMBER *c2)
480 if ( (l=c1->n_len) != c2->n_len)
481 return( l - c2->n_len);
484 return( n_cmp( c1->n_part, c2->n_part, l) );
487 void rsa_assign(rsa_NUMBER *d, rsa_NUMBER *s)
495 memcpy( d->n_part, s->n_part,
sizeof(rsa_INT)*l);