webmoney 0.0.14 → 0.0.15.pre

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,41 +0,0 @@
1
- #ifndef _INCLUDE_MD4
2
- #define _INCLUDE_MD4
3
- #include "stdafx.h"
4
-
5
- #ifndef _WIN32
6
- #define _NOT_WIN32
7
- #endif
8
-
9
- #if defined(__FreeBSD__) && __FreeBSD__ < 5 /* for FreeBSD version <= 4 */
10
- #include <inttypes.h>
11
- #elif defined(_NOT_WIN32)
12
- #include <stdint.h>
13
- #endif
14
-
15
- #ifdef _WIN32
16
- typedef DWORD Word32Type;
17
- #else
18
- typedef uint32_t Word32Type;
19
- #endif
20
-
21
- typedef struct {
22
- Word32Type buffer[4];
23
- unsigned char count[8];
24
- unsigned int done;
25
- } MDstruct, *MDptr;
26
-
27
- #ifdef __cplusplus
28
- extern "C" {
29
- #endif
30
- extern void MDbegin(MDptr MDp) ;
31
-
32
- extern void MDupdate(MDptr MDp, unsigned char *X, Word32Type count) ;
33
-
34
- extern void MDprint(MDptr MDp) ;
35
-
36
- #ifdef __cplusplus
37
- }
38
- #endif
39
-
40
- #endif
41
- //---
@@ -1,838 +0,0 @@
1
- #include "stdafx.h"
2
- #ifdef _WIN32
3
- #ifndef _CONSOLE
4
- #endif
5
- #endif
6
-
7
- #include "rsalib1.h"
8
- #include <stdio.h>
9
-
10
- int N_NEG_VAL=-1;
11
-
12
- CRSALib::CRSALib(short glob_pres)
13
- {
14
- global_precision = glob_pres;
15
- int i, j;
16
- for (i=0; i< 16; i++)
17
- for (j=0; j< MAX_UNIT_PRECISION; j++)
18
- moduli_buf[i][j]=0;
19
- moduli[0] = 0;
20
- for (i=1; i<16+1; i++)
21
- moduli[i] = &moduli_buf[ i-1][0];
22
- for (i=0;i<16+1;i++)
23
- {
24
- msu_moduli[i] = 0;
25
- nmsu_moduli[i] = 0;
26
- }
27
- for (i=0; i< 16-1; i++)
28
- for (j=0; j< MAX_UNIT_PRECISION; j++)
29
- mpdbuf[i][j]=0;
30
-
31
- mpd[0] = 0;
32
- for (i=1; i < 16; i++)
33
- {
34
- mpd[i] = &mpdbuf[ i-1][0];
35
- }
36
- }
37
-
38
- boolean CRSALib::mp_addc(register unitptr r1,register unitptr r2,register boolean carry)
39
- {
40
- register ulint x;
41
- short precision;
42
- precision = global_precision;
43
-
44
- while (precision--)
45
- {
46
- x = (ulint) *r1 + (ulint) *((r2)++) + (ulint) carry;
47
- *((r1)++) = (unit)x;
48
- carry = ((x & ((ulint) 1 << 16)) != 0L);
49
- }
50
- return(carry);
51
- }
52
-
53
- boolean CRSALib::mp_subb(register unitptr r1,register unitptr r2,register boolean borrow)
54
- {
55
- register ulint x;
56
- short precision;
57
- precision = global_precision;
58
-
59
- while (precision--)
60
- {
61
- x = (ulint) *r1 - (ulint) *((r2)++) - (ulint) borrow;
62
- *((r1)++) = (unit)x;
63
- borrow = ((x & ((ulint) 1 << 16)) != 0L);
64
- }
65
- return(borrow);
66
- }
67
-
68
- boolean CRSALib::mp_rotate_left(register unitptr r1,register boolean carry)
69
- {
70
- register short precision;
71
- register boolean nextcarry;
72
- precision = global_precision;
73
-
74
- while (precision--)
75
- {
76
- nextcarry = (((signedunit) *r1) < 0);
77
-
78
- *r1 <<= 1 ;
79
- if (carry) *r1 |= 1;
80
- carry = nextcarry;
81
- (++(r1));
82
- }
83
- return(nextcarry);
84
- }
85
-
86
- boolean CRSALib::mp_rotate_right(register unitptr r1,register boolean carry)
87
- {
88
- register short precision;
89
- register boolean nextcarry;
90
- precision = global_precision;
91
- (r1) = ((r1)+(precision)-1);
92
- while (precision--)
93
- {
94
- nextcarry = *r1 & 1;
95
- *r1 >>= 1 ;
96
- if (carry) *r1 |= ((unit) 0x8000);
97
- carry = nextcarry;
98
- (--(r1));
99
- }
100
- return(nextcarry);
101
- }
102
-
103
- short CRSALib::mp_compare(register unitptr r1,register unitptr r2)
104
- {
105
- register short precision;
106
- precision = global_precision;
107
- (r1) = ((r1)+(precision)-1);
108
- (r2) = ((r2)+(precision)-1);
109
- do
110
- {
111
- if (*r1 < *r2)
112
- return(-1);
113
- if (*((r1)--) > *((r2)--))
114
- return(1);
115
- } while (--precision);
116
- return(0);
117
- }
118
-
119
- boolean CRSALib::mp_inc(register unitptr r)
120
- {
121
- register short precision;
122
- precision = global_precision;
123
-
124
- do
125
- { if ( ++(*r) ) return(0);
126
- ((r)++);
127
- } while (--precision);
128
- return(1);
129
- }
130
-
131
- boolean CRSALib::mp_dec(register unitptr r)
132
- {
133
- register short precision;
134
- precision = global_precision;
135
-
136
- do
137
- {
138
- if ( (signedunit) (--(*r)) != (signedunit) -1 )
139
- return(0);
140
- ((r)++);
141
- } while (--precision);
142
- return(1);
143
- }
144
-
145
- void CRSALib::mp_neg(register unitptr r)
146
- {
147
- register short precision;
148
- precision = global_precision;
149
-
150
- mp_dec(r);
151
- do
152
- {
153
- *r = ~(*r);
154
- r++;
155
- } while (--precision);
156
- }
157
-
158
- void CRSALib::mp_move(register unitptr dst,register unitptr src)
159
- {
160
- register short precision;
161
- precision = global_precision;
162
- do
163
- {
164
- *dst++ = *src++;
165
- } while (--precision);
166
- }
167
-
168
- void CRSALib::mp_init(register unitptr r, word16 value)
169
- {
170
- register short precision;
171
- precision = global_precision;
172
- *((r)++) = value;
173
- precision--;
174
- while (precision--)
175
- *((r)++) = 0;
176
- }
177
-
178
- short CRSALib::significance(register unitptr r)
179
- {
180
- register short precision;
181
- precision = global_precision;
182
- (r) = ((r)+(precision)-1);
183
- do
184
- {
185
- if (*((r)--))
186
- return(precision);
187
- } while (--precision);
188
- return(precision);
189
- }
190
-
191
- void CRSALib::unitfill0(unitptr r,word16 unitcount)
192
- {
193
- while (unitcount--) *r++ = 0;
194
- }
195
-
196
- int CRSALib::mp_udiv(register unitptr remainder,register unitptr quotient,
197
- register unitptr dividend,register unitptr divisor)
198
- {
199
- int bits;
200
- short dprec;
201
- register unit bitmask;
202
- if (( ((*(divisor))==(0)) && (significance(divisor)<=1) ))
203
- return(-1);
204
-
205
- mp_init(remainder,0);
206
- mp_init(quotient,0);
207
-
208
- {
209
- dprec = significance(dividend);
210
- if (!dprec) return(0);
211
- bits = ((dprec) << 4);
212
- (dividend) = ((dividend)+(dprec)-1);
213
- bitmask = ((unit) 0x8000);
214
- while (!(*(dividend) & bitmask))
215
- {
216
- bitmask >>= 1;
217
- bits--;
218
- }
219
- };
220
-
221
- (quotient) = ((quotient)+(dprec)-1);
222
-
223
- while (bits--)
224
- {
225
- mp_rotate_left(remainder,(boolean)((*(dividend) & bitmask)!=0));
226
- if (mp_compare(remainder,divisor) >= 0)
227
- {
228
- mp_subb(remainder,divisor,(boolean)0);
229
- *(quotient) |= bitmask;
230
- }
231
- {
232
- if (!(bitmask >>= 1))
233
- {
234
- bitmask = ((unit) 0x8000);
235
- ((dividend)--); ((quotient)--);
236
- }
237
- };
238
- }
239
- return(0);
240
- }
241
-
242
-
243
- int CRSALib::mp_div(register unitptr remainder,register unitptr quotient,
244
- register unitptr dividend,register unitptr divisor)
245
- {
246
- boolean dvdsign,dsign;
247
- int status;
248
- dvdsign = (((signedunit) (*((dividend)+(global_precision)-1)) < 0)!=0);
249
- dsign = (((signedunit) (*((divisor)+(global_precision)-1)) < 0)!=0);
250
- if (dvdsign) mp_neg(dividend);
251
- if (dsign) mp_neg(divisor);
252
- status = mp_udiv(remainder,quotient,dividend,divisor);
253
- if (dvdsign) mp_neg(dividend);
254
- if (dsign) mp_neg(divisor);
255
- if (status<0) return(status);
256
- if (dvdsign) mp_neg(remainder);
257
- if (dvdsign ^ dsign) mp_neg(quotient);
258
- return(status);
259
- }
260
-
261
-
262
- word16 CRSALib::mp_shortdiv(register unitptr quotient,
263
- register unitptr dividend,register word16 divisor)
264
- {
265
- int bits;
266
- short dprec;
267
- register unit bitmask;
268
- register word16 remainder;
269
- if (!divisor)
270
- return (N_NEG_VAL);
271
- remainder=0;
272
- mp_init(quotient,0);
273
-
274
- {
275
- dprec = significance(dividend);
276
- if (!dprec) return(0);
277
- bits = ((dprec) << 4);
278
- (dividend) = ((dividend)+(dprec)-1);
279
- bitmask = ((unit) 0x8000);
280
- while (!(*(dividend) & bitmask))
281
- {
282
- bitmask >>= 1;
283
- bits--;
284
- }
285
- };
286
-
287
- (quotient) = ((quotient)+(dprec)-1);
288
-
289
- while (bits--)
290
- {
291
- remainder <<= 1;
292
- if ((*(dividend) & bitmask))
293
- remainder++;
294
- if (remainder >= divisor)
295
- {
296
- remainder -= divisor;
297
- *(quotient) |= bitmask;
298
- }
299
- {
300
- if (!(bitmask >>= 1))
301
- {
302
- bitmask = ((unit) 0x8000);
303
- ((dividend)--);
304
- ((quotient)--);
305
- }
306
- };
307
- }
308
- return(remainder);
309
- }
310
-
311
-
312
- int CRSALib::mp_mod(register unitptr remainder,
313
- register unitptr dividend,register unitptr divisor)
314
- {
315
- int bits;
316
- short dprec;
317
- register unit bitmask;
318
- if (( ((*(divisor))==(0)) && (significance(divisor)<=1) ))
319
- return(-1);
320
- mp_init(remainder,0);
321
-
322
- { dprec = significance(dividend);
323
- if (!dprec) return(0);
324
- bits = ((dprec) << 4);
325
- (dividend) = ((dividend)+(dprec)-1);
326
- bitmask = ((unit) 0x8000);
327
- while (!(*(dividend) & bitmask))
328
- {
329
- bitmask >>= 1;
330
- bits--;
331
- }
332
- };
333
-
334
- while (bits--)
335
- {
336
- mp_rotate_left(remainder,(boolean)((*(dividend) & bitmask)!=0));
337
- if (mp_compare(remainder,divisor) >= 0)
338
- mp_subb(remainder,divisor,(boolean)0);
339
- {
340
- if (!(bitmask >>= 1))
341
- {
342
- bitmask = ((unit) 0x8000);
343
- ((dividend)--);
344
- }
345
- };
346
- }
347
- return(0);
348
- }
349
-
350
-
351
- word16 CRSALib::mp_shortmod(register unitptr dividend,register word16 divisor)
352
- {
353
- int bits;
354
- short dprec;
355
- register unit bitmask;
356
- register word16 remainder;
357
- if (!divisor)
358
- return(N_NEG_VAL);
359
- remainder=0;
360
-
361
- {
362
- dprec = significance(dividend);
363
- if (!dprec) return(0);
364
- bits = ((dprec) << 4);
365
- (dividend) = ((dividend)+(dprec)-1);
366
- bitmask = ((unit) 0x8000);
367
- while (!(*(dividend) & bitmask))
368
- {
369
- bitmask >>= 1;
370
- bits--;
371
- }
372
- };
373
-
374
- while (bits--)
375
- {
376
- remainder <<= 1;
377
- if ((*(dividend) & bitmask))
378
- remainder++;
379
- if (remainder >= divisor) remainder -= divisor;
380
- {
381
- if (!(bitmask >>= 1))
382
- {
383
- bitmask = ((unit) 0x8000); ((dividend)--);
384
- }
385
- };
386
- }
387
- return(remainder);
388
- }
389
-
390
- int CRSALib::mp_mult(register unitptr prod,
391
- register unitptr multiplicand,register unitptr multiplier)
392
- {
393
- int bits;
394
- register unit bitmask;
395
- short mprec;
396
- mp_init(prod,0);
397
- if (( ((*(multiplicand))==(0)) && (significance(multiplicand)<=1) ))
398
- return(0);
399
-
400
- mprec = significance(multiplier);
401
- if (!mprec) return(0);
402
- bits = ((mprec) << 4);
403
- (multiplier) = ((multiplier)+(mprec)-1);
404
- bitmask = ((unit) 0x8000);
405
- while (!(*(multiplier) & bitmask))
406
- {
407
- bitmask >>= 1;
408
- bits--;
409
- }
410
-
411
- while (bits--)
412
- {
413
- mp_rotate_left(prod,(boolean)0);
414
- if ((*(multiplier) & bitmask))
415
- {
416
- mp_addc(prod,multiplicand,(boolean)0);
417
- }
418
- if (!(bitmask >>= 1))
419
- {
420
- bitmask = ((unit) 0x8000);
421
- ((multiplier)--);
422
- }
423
- }
424
- return(0);
425
- }
426
-
427
- void CRSALib::mp_lshift_unit(register unitptr r1)
428
- {
429
- register short precision;
430
- register unitptr r2;
431
- precision = global_precision;
432
- (r1) = ((r1)+(precision)-1);
433
- r2 = r1;
434
- while (--precision)
435
- *((r1)--) = *(--(r2));
436
- *r1 = 0;
437
- }
438
-
439
- void CRSALib::stage_mp_images(unitptr images[16],unitptr r)
440
- {
441
- short int i;
442
- images[0] = r;
443
- for (i=1; i<16; i++)
444
- {
445
- mp_move(images[i],images[i-1]);
446
- mp_rotate_left(images[i],(boolean)0);
447
- }
448
- }
449
- int CRSALib::stage_merritt_modulus(unitptr n)
450
- {
451
- short int i;
452
- unitptr msu;
453
- moduli[0] = n;
454
-
455
-
456
- msu = ((n)+(global_precision)-1);
457
- msu_moduli[0] = *((msu)--);
458
- nmsu_moduli[0] = *msu;
459
-
460
- for (i=1; i<16+1; i++)
461
- {
462
- mp_move(moduli[i],moduli[i-1]);
463
- mp_rotate_left(moduli[i],(boolean)0);
464
-
465
- msu = ((moduli[i])+(global_precision)-1);
466
- msu_moduli[i] = *((msu)--);
467
- nmsu_moduli[i] = *msu;
468
- }
469
- return(0);
470
- }
471
-
472
- int CRSALib::merritt_modmult(register unitptr prod,
473
- unitptr multiplicand,register unitptr multiplier)
474
- {
475
-
476
- register signedunit p_m;
477
- register unitptr msu_prod;
478
- register unitptr nmsu_prod;
479
- short mprec;
480
-
481
-
482
- stage_mp_images(mpd,multiplicand);
483
-
484
- msu_prod = ((prod)+(global_precision)-1);
485
- nmsu_prod = msu_prod;
486
- ((nmsu_prod)--);
487
-
488
- mp_init(prod,0);
489
-
490
- mprec = significance(multiplier);
491
- if (mprec==0)
492
- return(0);
493
- (multiplier) = ((multiplier)+(mprec)-1);
494
-
495
- while (mprec--)
496
- {
497
- mp_lshift_unit(prod);
498
- if (*multiplier & ((unit) 1 << (15))) mp_addc(prod,mpd[15],(boolean)0);
499
- if (*multiplier & ((unit) 1 << (14))) mp_addc(prod,mpd[14],(boolean)0);
500
- if (*multiplier & ((unit) 1 << (13))) mp_addc(prod,mpd[13],(boolean)0);
501
- if (*multiplier & ((unit) 1 << (12))) mp_addc(prod,mpd[12],(boolean)0);
502
- if (*multiplier & ((unit) 1 << (11))) mp_addc(prod,mpd[11],(boolean)0);
503
- if (*multiplier & ((unit) 1 << (10))) mp_addc(prod,mpd[10],(boolean)0);
504
- if (*multiplier & ((unit) 1 << (9))) mp_addc(prod,mpd[9],(boolean)0);
505
- if (*multiplier & ((unit) 1 << (8))) mp_addc(prod,mpd[8],(boolean)0);
506
-
507
- if (*multiplier & ((unit) 1 << (7))) mp_addc(prod,mpd[7],(boolean)0);
508
- if (*multiplier & ((unit) 1 << (6))) mp_addc(prod,mpd[6],(boolean)0);
509
- if (*multiplier & ((unit) 1 << (5))) mp_addc(prod,mpd[5],(boolean)0);
510
- if (*multiplier & ((unit) 1 << (4))) mp_addc(prod,mpd[4],(boolean)0);
511
- if (*multiplier & ((unit) 1 << (3))) mp_addc(prod,mpd[3],(boolean)0);
512
- if (*multiplier & ((unit) 1 << (2))) mp_addc(prod,mpd[2],(boolean)0);
513
- if (*multiplier & ((unit) 1 << (1))) mp_addc(prod,mpd[1],(boolean)0);
514
- if (*multiplier & ((unit) 1 << (0))) mp_addc(prod,mpd[0],(boolean)0);
515
-
516
- if (((p_m = *msu_prod-msu_moduli[16])>0) || ( (p_m==0) && ( (*nmsu_prod>nmsu_moduli[16]) || ( (*nmsu_prod==nmsu_moduli[16]) && ((mp_compare(prod,moduli[16]) >= 0)) ))) ) mp_subb(prod,moduli[16],(boolean)0);
517
- if (((p_m = *msu_prod-msu_moduli[15])>0) || ( (p_m==0) && ( (*nmsu_prod>nmsu_moduli[15]) || ( (*nmsu_prod==nmsu_moduli[15]) && ((mp_compare(prod,moduli[15]) >= 0)) ))) ) mp_subb(prod,moduli[15],(boolean)0);
518
- if (((p_m = *msu_prod-msu_moduli[14])>0) || ( (p_m==0) && ( (*nmsu_prod>nmsu_moduli[14]) || ( (*nmsu_prod==nmsu_moduli[14]) && ((mp_compare(prod,moduli[14]) >= 0)) ))) ) mp_subb(prod,moduli[14],(boolean)0);
519
- if (((p_m = *msu_prod-msu_moduli[13])>0) || ( (p_m==0) && ( (*nmsu_prod>nmsu_moduli[13]) || ( (*nmsu_prod==nmsu_moduli[13]) && ((mp_compare(prod,moduli[13]) >= 0)) ))) ) mp_subb(prod,moduli[13],(boolean)0);
520
- if (((p_m = *msu_prod-msu_moduli[12])>0) || ( (p_m==0) && ( (*nmsu_prod>nmsu_moduli[12]) || ( (*nmsu_prod==nmsu_moduli[12]) && ((mp_compare(prod,moduli[12]) >= 0)) ))) ) mp_subb(prod,moduli[12],(boolean)0);
521
- if (((p_m = *msu_prod-msu_moduli[11])>0) || ( (p_m==0) && ( (*nmsu_prod>nmsu_moduli[11]) || ( (*nmsu_prod==nmsu_moduli[11]) && ((mp_compare(prod,moduli[11]) >= 0)) ))) ) mp_subb(prod,moduli[11],(boolean)0);
522
- if (((p_m = *msu_prod-msu_moduli[10])>0) || ( (p_m==0) && ( (*nmsu_prod>nmsu_moduli[10]) || ( (*nmsu_prod==nmsu_moduli[10]) && ((mp_compare(prod,moduli[10]) >= 0)) ))) ) mp_subb(prod,moduli[10],(boolean)0);
523
- if (((p_m = *msu_prod-msu_moduli[9])>0) || ( (p_m==0) && ( (*nmsu_prod>nmsu_moduli[9]) || ( (*nmsu_prod==nmsu_moduli[9]) && ((mp_compare(prod,moduli[9]) >= 0)) ))) ) mp_subb(prod,moduli[9],(boolean)0);
524
-
525
- if (((p_m = *msu_prod-msu_moduli[8])>0) || ( (p_m==0) && ( (*nmsu_prod>nmsu_moduli[8]) || ( (*nmsu_prod==nmsu_moduli[8]) && ((mp_compare(prod,moduli[8]) >= 0)) ))) ) mp_subb(prod,moduli[8],(boolean)0);
526
- if (((p_m = *msu_prod-msu_moduli[7])>0) || ( (p_m==0) && ( (*nmsu_prod>nmsu_moduli[7]) || ( (*nmsu_prod==nmsu_moduli[7]) && ((mp_compare(prod,moduli[7]) >= 0)) ))) ) mp_subb(prod,moduli[7],(boolean)0);
527
- if (((p_m = *msu_prod-msu_moduli[6])>0) || ( (p_m==0) && ( (*nmsu_prod>nmsu_moduli[6]) || ( (*nmsu_prod==nmsu_moduli[6]) && ((mp_compare(prod,moduli[6]) >= 0)) ))) ) mp_subb(prod,moduli[6],(boolean)0);
528
- if (((p_m = *msu_prod-msu_moduli[5])>0) || ( (p_m==0) && ( (*nmsu_prod>nmsu_moduli[5]) || ( (*nmsu_prod==nmsu_moduli[5]) && ((mp_compare(prod,moduli[5]) >= 0)) ))) ) mp_subb(prod,moduli[5],(boolean)0);
529
- if (((p_m = *msu_prod-msu_moduli[4])>0) || ( (p_m==0) && ( (*nmsu_prod>nmsu_moduli[4]) || ( (*nmsu_prod==nmsu_moduli[4]) && ((mp_compare(prod,moduli[4]) >= 0)) ))) ) mp_subb(prod,moduli[4],(boolean)0);
530
- if (((p_m = *msu_prod-msu_moduli[3])>0) || ( (p_m==0) && ( (*nmsu_prod>nmsu_moduli[3]) || ( (*nmsu_prod==nmsu_moduli[3]) && ((mp_compare(prod,moduli[3]) >= 0)) ))) ) mp_subb(prod,moduli[3],(boolean)0);
531
- if (((p_m = *msu_prod-msu_moduli[2])>0) || ( (p_m==0) && ( (*nmsu_prod>nmsu_moduli[2]) || ( (*nmsu_prod==nmsu_moduli[2]) && ((mp_compare(prod,moduli[2]) >= 0)) ))) ) mp_subb(prod,moduli[2],(boolean)0);
532
- if (((p_m = *msu_prod-msu_moduli[1])>0) || ( (p_m==0) && ( (*nmsu_prod>nmsu_moduli[1]) || ( (*nmsu_prod==nmsu_moduli[1]) && ((mp_compare(prod,moduli[1]) >= 0)) ))) ) mp_subb(prod,moduli[1],(boolean)0);
533
- if (((p_m = *msu_prod-msu_moduli[0])>0) || ( (p_m==0) && ( (*nmsu_prod>nmsu_moduli[0]) || ( (*nmsu_prod==nmsu_moduli[0]) && ((mp_compare(prod,moduli[0]) >= 0)) ))) ) mp_subb(prod,moduli[0],(boolean)0);
534
-
535
- ((multiplier)--);
536
- }
537
- return(0);
538
- }
539
-
540
- void CRSALib::merritt_burn(void)
541
-
542
- {
543
- unitfill0(&(mpdbuf[0][0]),(16-1)*(MAX_UNIT_PRECISION));
544
- unitfill0(&(moduli_buf[0][0]),(16)*(MAX_UNIT_PRECISION));
545
- unitfill0(msu_moduli,16+1);
546
- unitfill0(nmsu_moduli,16+1);
547
- }
548
-
549
-
550
- int CRSALib::countbits(unitptr r)
551
- {
552
- int bits;
553
- short prec;
554
- register unit bitmask;
555
- {
556
- prec = significance(r);
557
- if (!prec) return(0);
558
- bits = ((prec) << 4);
559
- (r) = ((r)+(prec)-1);
560
- bitmask = ((unit) 0x8000);
561
- while (!(*(r) & bitmask))
562
- {
563
- bitmask >>= 1; bits--;
564
- }
565
- };
566
- return(bits);
567
- }
568
-
569
-
570
- int CRSALib::mp_modexp(register unitptr expout,register unitptr expin,
571
- register unitptr exponent,register unitptr modulus)
572
- {
573
- int bits;
574
- short oldprecision;
575
- register unit bitmask;
576
- unit product[(MAX_UNIT_PRECISION)];
577
- short eprec;
578
-
579
- mp_init(expout,1);
580
- if (( ((*(exponent))==(0)) && (significance(exponent)<=1) ))
581
- {
582
- if (( ((*(expin))==(0)) && (significance(expin)<=1) ))
583
- return(-1);
584
- return(0);
585
- }
586
- if (( ((*(modulus))==(0)) && (significance(modulus)<=1) ))
587
- return(-2);
588
-
589
- if (((signedunit) (*((modulus)+(global_precision)-1)) < 0))
590
- return(-2);
591
-
592
- if (mp_compare(expin,modulus) >= 0)
593
- return(-3);
594
- if (mp_compare(exponent,modulus) >= 0)
595
- return(-4);
596
-
597
- oldprecision = global_precision;
598
-
599
- (global_precision = ((((countbits(modulus)+(16+1))+15) >> 4)));
600
-
601
-
602
- if (stage_merritt_modulus(modulus))
603
- {
604
- (global_precision = (oldprecision));
605
- return(-5);
606
- }
607
- {
608
- eprec = significance(exponent);
609
- if (!eprec) return(0);
610
- bits = ((eprec) << 4);
611
- (exponent) = ((exponent)+(eprec)-1);
612
- bitmask = ((unit) 0x8000);
613
- while (!(*(exponent) & bitmask))
614
- {
615
- bitmask >>= 1;
616
- bits--;
617
- }
618
- };
619
-
620
- bits--;
621
- mp_move(expout,expin);
622
- { if (!(bitmask >>= 1)) { bitmask = ((unit) 0x8000); ((exponent)--); } };
623
-
624
- while (bits--)
625
- {
626
- merritt_modmult(product,expout,expout);
627
- mp_move(expout,product);
628
- if ((*(exponent) & bitmask))
629
- {
630
- merritt_modmult(product,expout,expin);
631
- mp_move(expout,product);
632
- }
633
- if (!(bitmask >>= 1))
634
- {
635
- bitmask = ((unit) 0x8000);
636
- ((exponent)--);
637
- }
638
- }
639
- mp_init(product,0);
640
- merritt_burn();
641
-
642
- (global_precision = (oldprecision));
643
- return(0);
644
- }
645
-
646
- int CRSALib::rsa_decrypt(unitptr M, unitptr C,
647
- unitptr d, unitptr p, unitptr q, unitptr u)
648
- {
649
- unit p2[(MAX_UNIT_PRECISION)];
650
- unit q2[(MAX_UNIT_PRECISION)];
651
- unit temp1[(MAX_UNIT_PRECISION)];
652
- unit temp2[(MAX_UNIT_PRECISION)];
653
- int status;
654
-
655
- mp_init(M,1);
656
-
657
- if (mp_compare(p,q) >= 0)
658
- {
659
- unitptr t;
660
- t = p; p = q; q = t;
661
- }
662
-
663
- mp_move(temp1,p);
664
- mp_dec(temp1);
665
- mp_mod(temp2,d,temp1);
666
- mp_mod(temp1,C,p);
667
- status = mp_modexp(p2,temp1,temp2,p);
668
- if (status < 0)
669
- return(status);
670
-
671
- mp_move(temp1,q);
672
- mp_dec(temp1);
673
- mp_mod(temp2,d,temp1);
674
- mp_mod(temp1,C,q);
675
- status = mp_modexp(q2,temp1,temp2,q);
676
- if (status < 0)
677
- return(status);
678
-
679
- if (mp_compare(p2,q2) == 0)
680
- mp_move(M,p2);
681
- else
682
- {
683
- if (mp_subb(q2,p2,(boolean)0))
684
- mp_addc(q2,q,(boolean)0);
685
-
686
- mp_mult(temp1,q2,u);
687
- mp_mod(temp2,temp1,q);
688
- mp_mult(temp1,p,temp2);
689
- mp_addc(temp1,p2,(boolean)0);
690
- mp_move(M,temp1);
691
- }
692
-
693
- mp_init(p2,0);
694
- mp_init(q2,0);
695
- mp_init(temp1,0);
696
- mp_init(temp2,0);
697
-
698
- return(0);
699
- }
700
-
701
- int CRSALib::mp_sqrt(unitptr quotient,unitptr dividend)
702
- {
703
- register char next2bits;
704
- register unit dvdbitmask,qbitmask;
705
- unit remainder[(MAX_UNIT_PRECISION)],rjq[(MAX_UNIT_PRECISION)],
706
- divisor[(MAX_UNIT_PRECISION)];
707
- unsigned int qbits,qprec,dvdbits,dprec,oldprecision;
708
- int notperfect;
709
-
710
- mp_init(quotient,0);
711
- if (((signedunit) (*((dividend)+(global_precision)-1)) < 0))
712
- {
713
- mp_dec(quotient);
714
- return(-1);
715
- }
716
-
717
- {
718
- dprec = significance(dividend);
719
- if (!dprec) return(0);
720
- dvdbits = ((dprec) << 4);
721
- (dividend) = ((dividend)+(dprec)-1);
722
- dvdbitmask = ((unit) 0x8000);
723
- while (!(*(dividend) & dvdbitmask))
724
- {
725
- dvdbitmask >>= 1;
726
- dvdbits--;
727
- }
728
- };
729
-
730
- if (dvdbits==1)
731
- {
732
- mp_init(quotient,1);
733
- return(0);
734
- }
735
-
736
-
737
- qbits = (dvdbits+1) >> 1;
738
- qprec = (((qbits)+15) >> 4);
739
-
740
- (quotient) = ((quotient)+(qprec)-1);
741
- qbitmask = ((unit) 1 << ((qbits-1) & (16-1))) ;
742
-
743
- oldprecision = global_precision;
744
- (global_precision = ((((qbits+3)+15) >> 4)));
745
-
746
- *(quotient) |= qbitmask;
747
- {
748
- if (!(qbitmask >>= 1))
749
- {
750
- qbitmask = ((unit) 0x8000);
751
- ((quotient)--);
752
- }
753
- };
754
-
755
- mp_init(rjq,1);
756
-
757
- if (!(dvdbits & 1))
758
- {
759
- next2bits = 2;
760
- {
761
- if (!(dvdbitmask >>= 1))
762
- {
763
- dvdbitmask = ((unit) 0x8000);
764
- ((dividend)--);
765
- }
766
- };
767
- dvdbits--;
768
- if ((*(dividend) & dvdbitmask))
769
- next2bits++;
770
- {
771
- if (!(dvdbitmask >>= 1))
772
- {
773
- dvdbitmask = ((unit) 0x8000);
774
- ((dividend)--);
775
- }
776
- };
777
- dvdbits--;
778
- }
779
- else
780
- {
781
- next2bits = 1;
782
- {
783
- if (!(dvdbitmask >>= 1))
784
- {
785
- dvdbitmask = ((unit) 0x8000);
786
- ((dividend)--);
787
- }
788
- };
789
- dvdbits--;
790
- }
791
-
792
- mp_init(remainder,next2bits-1);
793
-
794
- while (dvdbits)
795
- {
796
- next2bits=0;
797
- if ((*(dividend) & dvdbitmask)) next2bits=2;
798
- {
799
- if (!(dvdbitmask >>= 1))
800
- {
801
- dvdbitmask = ((unit) 0x8000);
802
- ((dividend)--);
803
- }
804
- };
805
- dvdbits--;
806
- if ((*(dividend) & dvdbitmask))
807
- next2bits++;
808
- if (!(dvdbitmask >>= 1))
809
- {
810
- dvdbitmask = ((unit) 0x8000);
811
- ((dividend)--);
812
- }
813
- dvdbits--;
814
- mp_rotate_left(remainder,(boolean)((next2bits&2)!=0));
815
- mp_rotate_left(remainder,(boolean)((next2bits&1)!=0));
816
-
817
- mp_move(divisor,rjq);
818
- mp_rotate_left(divisor,0);
819
- mp_rotate_left(divisor,1);
820
- if (mp_compare(remainder,divisor) >= 0)
821
- {
822
- mp_subb(remainder,divisor,(boolean)0);
823
- *(quotient) |= qbitmask;
824
- mp_rotate_left(rjq,1);
825
- }
826
- else
827
- mp_rotate_left(rjq,0);
828
- if (!(qbitmask >>= 1))
829
- {
830
- qbitmask = ((unit) 0x8000);
831
- ((quotient)--);
832
- }
833
- }
834
- notperfect = ( ((*(remainder))!=(0)) || (significance(remainder)>1) );
835
- (global_precision = (oldprecision));
836
- return(notperfect);
837
- }
838
- //----