Coverage Report

Created: 2025-08-03 06:31

/src/dropbear/libtomcrypt/src/math/ltm_desc.c
Line
Count
Source (jump to first uncovered line)
1
/* LibTomCrypt, modular cryptographic library -- Tom St Denis
2
 *
3
 * LibTomCrypt is a library that provides various cryptographic
4
 * algorithms in a highly modular and flexible manner.
5
 *
6
 * The library is free for all purposes without any express
7
 * guarantee it works.
8
 */
9
10
#define DESC_DEF_ONLY
11
#include "tomcrypt.h"
12
13
#ifdef LTM_DESC
14
15
#include <tommath.h>
16
17
static const struct {
18
    mp_err mpi_code;
19
    int ltc_code;
20
} mpi_to_ltc_codes[] = {
21
   { MP_OKAY ,  CRYPT_OK},
22
   { MP_MEM  ,  CRYPT_MEM},
23
   { MP_VAL  ,  CRYPT_INVALID_ARG},
24
   { MP_ITER ,  CRYPT_INVALID_PACKET},
25
   { MP_BUF  ,  CRYPT_BUFFER_OVERFLOW},
26
};
27
28
/**
29
   Convert a MPI error to a LTC error (Possibly the most powerful function ever!  Oh wait... no)
30
   @param err    The error to convert
31
   @return The equivalent LTC error code or CRYPT_ERROR if none found
32
*/
33
static int mpi_to_ltc_error(mp_err err)
34
14.5M
{
35
14.5M
   size_t x;
36
37
14.5M
   for (x = 0; x < sizeof(mpi_to_ltc_codes)/sizeof(mpi_to_ltc_codes[0]); x++) {
38
14.5M
       if (err == mpi_to_ltc_codes[x].mpi_code) {
39
14.5M
          return mpi_to_ltc_codes[x].ltc_code;
40
14.5M
       }
41
14.5M
   }
42
0
   return CRYPT_ERROR;
43
14.5M
}
44
45
static int init_mpi(void **a)
46
1.07M
{
47
1.07M
   LTC_ARGCHK(a != NULL);
48
49
1.07M
   *a = XCALLOC(1, sizeof(mp_int));
50
1.07M
   if (*a == NULL) {
51
0
      return CRYPT_MEM;
52
1.07M
   } else {
53
1.07M
      return CRYPT_OK;
54
1.07M
   }
55
1.07M
}
56
57
static int init(void **a)
58
1.07M
{
59
1.07M
   int err;
60
61
1.07M
   LTC_ARGCHK(a != NULL);
62
63
1.07M
   if ((err = init_mpi(a)) != CRYPT_OK) {
64
0
      return err;
65
0
   }
66
1.07M
   if ((err = mpi_to_ltc_error(mp_init(*a))) != CRYPT_OK) {
67
0
      XFREE(*a);
68
0
   }
69
1.07M
   return err;
70
1.07M
}
71
72
static void deinit(void *a)
73
1.07M
{
74
1.07M
   LTC_ARGCHKVD(a != NULL);
75
1.07M
   mp_clear(a);
76
1.07M
   XFREE(a);
77
1.07M
}
78
79
static int neg(void *a, void *b)
80
0
{
81
0
   LTC_ARGCHK(a != NULL);
82
0
   LTC_ARGCHK(b != NULL);
83
0
   return mpi_to_ltc_error(mp_neg(a, b));
84
0
}
85
86
static int copy(void *a, void *b)
87
952k
{
88
952k
   LTC_ARGCHK(a != NULL);
89
952k
   LTC_ARGCHK(b != NULL);
90
952k
   return mpi_to_ltc_error(mp_copy(a, b));
91
952k
}
92
93
static int init_copy(void **a, void *b)
94
0
{
95
0
   int err;
96
0
   LTC_ARGCHK(a  != NULL);
97
0
   LTC_ARGCHK(b  != NULL);
98
0
   if ((err = init_mpi(a)) != CRYPT_OK) return err;
99
0
   return mpi_to_ltc_error(mp_init_copy(*a, b));
100
0
}
101
102
/* ---- trivial ---- */
103
static int set_int(void *a, ltc_mp_digit b)
104
514
{
105
514
   LTC_ARGCHK(a != NULL);
106
514
   mp_set_u32(a, b);
107
514
   return CRYPT_OK;
108
514
}
109
110
static unsigned long get_int(void *a)
111
0
{
112
0
   LTC_ARGCHK(a != NULL);
113
0
   return mp_get_ul(a);
114
0
}
115
116
static ltc_mp_digit get_digit(void *a, int n)
117
307k
{
118
307k
   mp_int *A;
119
307k
   LTC_ARGCHK(a != NULL);
120
307k
   A = a;
121
307k
   return (n >= A->used || n < 0) ? 0 : A->dp[n];
122
307k
}
123
124
static int get_digit_count(void *a)
125
305k
{
126
305k
   mp_int *A;
127
305k
   LTC_ARGCHK(a != NULL);
128
305k
   A = a;
129
305k
   return A->used;
130
305k
}
131
132
static int compare(void *a, void *b)
133
1.52M
{
134
1.52M
   LTC_ARGCHK(a != NULL);
135
1.52M
   LTC_ARGCHK(b != NULL);
136
1.52M
   switch (mp_cmp(a, b)) {
137
764k
      case MP_LT: return LTC_MP_LT;
138
0
      case MP_EQ: return LTC_MP_EQ;
139
758k
      case MP_GT: return LTC_MP_GT;
140
0
      default:    return 0;
141
1.52M
   }
142
1.52M
}
143
144
static int compare_d(void *a, ltc_mp_digit b)
145
1.67M
{
146
1.67M
   LTC_ARGCHK(a != NULL);
147
1.67M
   switch (mp_cmp_d(a, b)) {
148
834k
      case MP_LT: return LTC_MP_LT;
149
0
      case MP_EQ: return LTC_MP_EQ;
150
840k
      case MP_GT: return LTC_MP_GT;
151
0
      default:    return 0;
152
1.67M
   }
153
1.67M
}
154
155
static int count_bits(void *a)
156
0
{
157
0
   LTC_ARGCHK(a != NULL);
158
0
   return mp_count_bits(a);
159
0
}
160
161
static int count_lsb_bits(void *a)
162
0
{
163
0
   LTC_ARGCHK(a != NULL);
164
0
   return mp_cnt_lsb(a);
165
0
}
166
167
168
static int twoexpt(void *a, int n)
169
0
{
170
0
   LTC_ARGCHK(a != NULL);
171
0
   return mpi_to_ltc_error(mp_2expt(a, n));
172
0
}
173
174
/* ---- conversions ---- */
175
176
/* read ascii string */
177
static int read_radix(void *a, const char *b, int radix)
178
640
{
179
640
   LTC_ARGCHK(a != NULL);
180
640
   LTC_ARGCHK(b != NULL);
181
640
   return mpi_to_ltc_error(mp_read_radix(a, b, radix));
182
640
}
183
184
/* write one */
185
static int write_radix(void *a, char *b, int radix)
186
0
{
187
0
   LTC_ARGCHK(a != NULL);
188
0
   LTC_ARGCHK(b != NULL);
189
0
   return mpi_to_ltc_error(mp_to_radix(a, b, SIZE_MAX, NULL, radix));
190
0
}
191
192
/* get size as unsigned char string */
193
static unsigned long unsigned_size(void *a)
194
1.16k
{
195
1.16k
   LTC_ARGCHK(a != NULL);
196
1.16k
   return (unsigned long)mp_ubin_size(a);
197
1.16k
}
198
199
/* store */
200
static int unsigned_write(void *a, unsigned char *b)
201
1.16k
{
202
1.16k
   LTC_ARGCHK(a != NULL);
203
1.16k
   LTC_ARGCHK(b != NULL);
204
1.16k
   return mpi_to_ltc_error(mp_to_ubin(a, b, SIZE_MAX, NULL));
205
1.16k
}
206
207
/* read */
208
static int unsigned_read(void *a, unsigned char *b, unsigned long len)
209
160
{
210
160
   LTC_ARGCHK(a != NULL);
211
160
   LTC_ARGCHK(b != NULL);
212
160
   return mpi_to_ltc_error(mp_from_ubin(a, b, (size_t)len));
213
160
}
214
215
/* add */
216
static int add(void *a, void *b, void *c)
217
2.35M
{
218
2.35M
   LTC_ARGCHK(a != NULL);
219
2.35M
   LTC_ARGCHK(b != NULL);
220
2.35M
   LTC_ARGCHK(c != NULL);
221
2.35M
   return mpi_to_ltc_error(mp_add(a, b, c));
222
2.35M
}
223
224
static int addi(void *a, ltc_mp_digit b, void *c)
225
0
{
226
0
   LTC_ARGCHK(a != NULL);
227
0
   LTC_ARGCHK(c != NULL);
228
0
   return mpi_to_ltc_error(mp_add_d(a, b, c));
229
0
}
230
231
/* sub */
232
static int sub(void *a, void *b, void *c)
233
2.50M
{
234
2.50M
   LTC_ARGCHK(a != NULL);
235
2.50M
   LTC_ARGCHK(b != NULL);
236
2.50M
   LTC_ARGCHK(c != NULL);
237
2.50M
   return mpi_to_ltc_error(mp_sub(a, b, c));
238
2.50M
}
239
240
static int subi(void *a, ltc_mp_digit b, void *c)
241
0
{
242
0
   LTC_ARGCHK(a != NULL);
243
0
   LTC_ARGCHK(c != NULL);
244
0
   return mpi_to_ltc_error(mp_sub_d(a, b, c));
245
0
}
246
247
/* mul */
248
static int mul(void *a, void *b, void *c)
249
2.43M
{
250
2.43M
   LTC_ARGCHK(a != NULL);
251
2.43M
   LTC_ARGCHK(b != NULL);
252
2.43M
   LTC_ARGCHK(c != NULL);
253
2.43M
   return mpi_to_ltc_error(mp_mul(a, b, c));
254
2.43M
}
255
256
static int muli(void *a, ltc_mp_digit b, void *c)
257
0
{
258
0
   LTC_ARGCHK(a != NULL);
259
0
   LTC_ARGCHK(c != NULL);
260
0
   return mpi_to_ltc_error(mp_mul_d(a, b, c));
261
0
}
262
263
/* sqr */
264
static int sqr(void *a, void *b)
265
1.21M
{
266
1.21M
   LTC_ARGCHK(a != NULL);
267
1.21M
   LTC_ARGCHK(b != NULL);
268
1.21M
   return mpi_to_ltc_error(mp_sqr(a, b));
269
1.21M
}
270
271
/* div */
272
static int divide(void *a, void *b, void *c, void *d)
273
760
{
274
760
   LTC_ARGCHK(a != NULL);
275
760
   LTC_ARGCHK(b != NULL);
276
760
   return mpi_to_ltc_error(mp_div(a, b, c, d));
277
760
}
278
279
static int div_2(void *a, void *b)
280
304k
{
281
304k
   LTC_ARGCHK(a != NULL);
282
304k
   LTC_ARGCHK(b != NULL);
283
304k
   return mpi_to_ltc_error(mp_div_2(a, b));
284
304k
}
285
286
/* modi */
287
static int modi(void *a, ltc_mp_digit b, ltc_mp_digit *c)
288
0
{
289
0
   mp_digit tmp;
290
0
   int      err;
291
292
0
   LTC_ARGCHK(a != NULL);
293
0
   LTC_ARGCHK(c != NULL);
294
295
0
   if ((err = mpi_to_ltc_error(mp_mod_d(a, b, &tmp))) != CRYPT_OK) {
296
0
      return err;
297
0
   }
298
0
   *c = tmp;
299
0
   return CRYPT_OK;
300
0
}
301
302
/* gcd */
303
static int gcd(void *a, void *b, void *c)
304
0
{
305
0
   LTC_ARGCHK(a != NULL);
306
0
   LTC_ARGCHK(b != NULL);
307
0
   LTC_ARGCHK(c != NULL);
308
0
   return mpi_to_ltc_error(mp_gcd(a, b, c));
309
0
}
310
311
/* lcm */
312
static int lcm(void *a, void *b, void *c)
313
0
{
314
0
   LTC_ARGCHK(a != NULL);
315
0
   LTC_ARGCHK(b != NULL);
316
0
   LTC_ARGCHK(c != NULL);
317
0
   return mpi_to_ltc_error(mp_lcm(a, b, c));
318
0
}
319
320
static int addmod(void *a, void *b, void *c, void *d)
321
0
{
322
0
   LTC_ARGCHK(a != NULL);
323
0
   LTC_ARGCHK(b != NULL);
324
0
   LTC_ARGCHK(c != NULL);
325
0
   LTC_ARGCHK(d != NULL);
326
0
   return mpi_to_ltc_error(mp_addmod(a,b,c,d));
327
0
}
328
329
static int submod(void *a, void *b, void *c, void *d)
330
0
{
331
0
   LTC_ARGCHK(a != NULL);
332
0
   LTC_ARGCHK(b != NULL);
333
0
   LTC_ARGCHK(c != NULL);
334
0
   LTC_ARGCHK(d != NULL);
335
0
   return mpi_to_ltc_error(mp_submod(a,b,c,d));
336
0
}
337
338
static int mulmod(void *a, void *b, void *c, void *d)
339
1.06k
{
340
1.06k
   LTC_ARGCHK(a != NULL);
341
1.06k
   LTC_ARGCHK(b != NULL);
342
1.06k
   LTC_ARGCHK(c != NULL);
343
1.06k
   LTC_ARGCHK(d != NULL);
344
1.06k
   return mpi_to_ltc_error(mp_mulmod(a,b,c,d));
345
1.06k
}
346
347
static int sqrmod(void *a, void *b, void *c)
348
0
{
349
0
   LTC_ARGCHK(a != NULL);
350
0
   LTC_ARGCHK(b != NULL);
351
0
   LTC_ARGCHK(c != NULL);
352
0
   return mpi_to_ltc_error(mp_sqrmod(a,b,c));
353
0
}
354
355
/* invmod */
356
static int invmod(void *a, void *b, void *c)
357
354
{
358
354
   LTC_ARGCHK(a != NULL);
359
354
   LTC_ARGCHK(b != NULL);
360
354
   LTC_ARGCHK(c != NULL);
361
354
   return mpi_to_ltc_error(mp_invmod(a, b, c));
362
354
}
363
364
/* setup */
365
static int montgomery_setup(void *a, void **b)
366
354
{
367
354
   int err;
368
354
   LTC_ARGCHK(a != NULL);
369
354
   LTC_ARGCHK(b != NULL);
370
354
   *b = XCALLOC(1, sizeof(mp_digit));
371
354
   if (*b == NULL) {
372
0
      return CRYPT_MEM;
373
0
   }
374
354
   if ((err = mpi_to_ltc_error(mp_montgomery_setup(a, (mp_digit *)*b))) != CRYPT_OK) {
375
0
      XFREE(*b);
376
0
   }
377
354
   return err;
378
354
}
379
380
/* get normalization value */
381
static int montgomery_normalization(void *a, void *b)
382
354
{
383
354
   LTC_ARGCHK(a != NULL);
384
354
   LTC_ARGCHK(b != NULL);
385
354
   return mpi_to_ltc_error(mp_montgomery_calc_normalization(a, b));
386
354
}
387
388
/* reduce */
389
static int montgomery_reduce(void *a, void *b, void *c)
390
3.65M
{
391
3.65M
   LTC_ARGCHK(a != NULL);
392
3.65M
   LTC_ARGCHK(b != NULL);
393
3.65M
   LTC_ARGCHK(c != NULL);
394
3.65M
   return mpi_to_ltc_error(mp_montgomery_reduce(a, b, *((mp_digit *)c)));
395
3.65M
}
396
397
/* clean up */
398
static void montgomery_deinit(void *a)
399
354
{
400
354
   XFREE(a);
401
354
}
402
403
static int exptmod(void *a, void *b, void *c, void *d)
404
0
{
405
0
   LTC_ARGCHK(a != NULL);
406
0
   LTC_ARGCHK(b != NULL);
407
0
   LTC_ARGCHK(c != NULL);
408
0
   LTC_ARGCHK(d != NULL);
409
0
   return mpi_to_ltc_error(mp_exptmod(a,b,c,d));
410
0
}
411
412
static int isprime(void *a, int b, int *c)
413
0
{
414
0
   int err;
415
0
   LTC_ARGCHK(a != NULL);
416
0
   LTC_ARGCHK(c != NULL);
417
0
   b = mp_prime_rabin_miller_trials(mp_count_bits(a));
418
0
   err = mpi_to_ltc_error(mp_prime_is_prime(a, b, c));
419
0
   *c = (*c == MP_YES) ? LTC_MP_YES : LTC_MP_NO;
420
0
   return err;
421
0
}
422
423
static int set_rand(void *a, int size)
424
0
{
425
0
   LTC_ARGCHK(a != NULL);
426
0
   return mpi_to_ltc_error(mp_rand(a, size));
427
0
}
428
429
const ltc_math_descriptor ltm_desc = {
430
431
   "LibTomMath",
432
   (int)MP_DIGIT_BIT,
433
434
   &init,
435
   &init_copy,
436
   &deinit,
437
438
   &neg,
439
   &copy,
440
441
   &set_int,
442
   &get_int,
443
   &get_digit,
444
   &get_digit_count,
445
   &compare,
446
   &compare_d,
447
   &count_bits,
448
   &count_lsb_bits,
449
   &twoexpt,
450
451
   &read_radix,
452
   &write_radix,
453
   &unsigned_size,
454
   &unsigned_write,
455
   &unsigned_read,
456
457
   &add,
458
   &addi,
459
   &sub,
460
   &subi,
461
   &mul,
462
   &muli,
463
   &sqr,
464
   &divide,
465
   &div_2,
466
   &modi,
467
   &gcd,
468
   &lcm,
469
470
   &mulmod,
471
   &sqrmod,
472
   &invmod,
473
474
   &montgomery_setup,
475
   &montgomery_normalization,
476
   &montgomery_reduce,
477
   &montgomery_deinit,
478
479
   &exptmod,
480
   &isprime,
481
482
#ifdef LTC_MECC
483
#ifdef LTC_MECC_FP
484
   &ltc_ecc_fp_mulmod,
485
#else
486
   &ltc_ecc_mulmod,
487
#endif
488
   &ltc_ecc_projective_add_point,
489
   &ltc_ecc_projective_dbl_point,
490
   &ltc_ecc_map,
491
#ifdef LTC_ECC_SHAMIR
492
#ifdef LTC_MECC_FP
493
   &ltc_ecc_fp_mul2add,
494
#else
495
   &ltc_ecc_mul2add,
496
#endif /* LTC_MECC_FP */
497
#else
498
   NULL,
499
#endif /* LTC_ECC_SHAMIR */
500
#else
501
   NULL, NULL, NULL, NULL, NULL,
502
#endif /* LTC_MECC */
503
504
#ifdef LTC_MRSA
505
   &rsa_make_key,
506
   &rsa_exptmod,
507
#else
508
   NULL, NULL,
509
#endif
510
   &addmod,
511
   &submod,
512
513
   &set_rand,
514
515
};
516
517
518
#endif
519
520
/* ref:         $Format:%D$ */
521
/* git commit:  $Format:%H$ */
522
/* commit time: $Format:%ai$ */