1f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* LibTomCrypt, modular cryptographic library -- Tom St Denis
2f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
3f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * LibTomCrypt is a library that provides various cryptographic
4f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * algorithms in a highly modular and flexible manner.
5f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
6f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * The library is free for all purposes without any express
7f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * guarantee it works.
8f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
9f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com
10f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */
11f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
12f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define DESC_DEF_ONLY
13f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "tomcrypt.h"
14f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef GMP_DESC
16f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
17f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include <stdio.h>
18f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include <gmp.h>
19f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
20f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int init(void **a)
21f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   *a = XCALLOC(1, sizeof(__mpz_struct));
25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if (*a == NULL) {
26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      return CRYPT_MEM;
27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mpz_init(((__mpz_struct *)*a));
29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic void deinit(void *a)
33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHKVD(a != NULL);
35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mpz_clear(a);
36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   XFREE(a);
37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int neg(void *a, void *b)
40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(b != NULL);
43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mpz_neg(b, a);
44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int copy(void *a, void *b)
48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(b != NULL);
51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mpz_set(b, a);
52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int init_copy(void **a, void *b)
56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if (init(a) != CRYPT_OK) {
58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      return CRYPT_MEM;
59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return copy(b, *a);
61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* ---- trivial ---- */
64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int set_int(void *a, unsigned long b)
65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mpz_set_ui(((__mpz_struct *)a), b);
68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
70f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
71f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic unsigned long get_int(void *a)
72f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
73f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
74f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return mpz_get_ui(a);
75f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
76f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
77f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic unsigned long get_digit(void *a, int n)
78f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
79f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
80f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return mpz_getlimbn(a, n);
81f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
82f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
83f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int get_digit_count(void *a)
84f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
85f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
86f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return mpz_size(a);
87f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
88f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
89f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int compare(void *a, void *b)
90f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
91f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   int ret;
92f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
93f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(b != NULL);
94f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   ret = mpz_cmp(a, b);
95f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if (ret < 0) {
96f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      return LTC_MP_LT;
97f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   } else if (ret > 0) {
98f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      return LTC_MP_GT;
99f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   } else {
100f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      return LTC_MP_EQ;
101f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
102f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
103f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
104f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int compare_d(void *a, unsigned long b)
105f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
106f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   int ret;
107f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
108f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   ret = mpz_cmp_ui(((__mpz_struct *)a), b);
109f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if (ret < 0) {
110f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      return LTC_MP_LT;
111f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   } else if (ret > 0) {
112f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      return LTC_MP_GT;
113f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   } else {
114f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      return LTC_MP_EQ;
115f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
116f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
117f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
118f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int count_bits(void *a)
119f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
120f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
121f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return mpz_sizeinbase(a, 2);
122f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
123f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
124f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int count_lsb_bits(void *a)
125f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
126f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
127f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return mpz_scan1(a, 0);
128f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
129f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
130f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
131f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int twoexpt(void *a, int n)
132f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
133f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
134f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mpz_set_ui(a, 0);
135f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mpz_setbit(a, n);
136f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
137f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
138f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
139f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* ---- conversions ---- */
140f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
141f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* read ascii string */
142f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int read_radix(void *a, const char *b, int radix)
143f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
144f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
145f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(b != NULL);
146f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mpz_set_str(a, b, radix);
147f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
148f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
149f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
150f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* write one */
151f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int write_radix(void *a, char *b, int radix)
152f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
153f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
154f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(b != NULL);
155f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mpz_get_str(b, radix, a);
156f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
157f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
158f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
159f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* get size as unsigned char string */
160f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic unsigned long unsigned_size(void *a)
161f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
162f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   unsigned long t;
163f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
164f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   t = mpz_sizeinbase(a, 2);
165f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if (mpz_cmp_ui(((__mpz_struct *)a), 0) == 0) return 0;
166f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return (t>>3) + ((t&7)?1:0);
167f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
168f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
169f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* store */
170f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int unsigned_write(void *a, unsigned char *b)
171f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
172f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
173f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(b != NULL);
174f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mpz_export(b, NULL, 1, 1, 1, 0, ((__mpz_struct*)a));
175f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
176f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
177f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
178f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* read */
179f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int unsigned_read(void *a, unsigned char *b, unsigned long len)
180f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
181f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
182f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(b != NULL);
183f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mpz_import(a, len, 1, 1, 1, 0, b);
184f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
185f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
186f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
187f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* add */
188f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int add(void *a, void *b, void *c)
189f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
190f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
191f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(b != NULL);
192f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(c != NULL);
193f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mpz_add(c, a, b);
194f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
195f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
196f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
197f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int addi(void *a, unsigned long b, void *c)
198f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
199f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
200f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(c != NULL);
201f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mpz_add_ui(c, a, b);
202f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
203f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
204f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
205f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* sub */
206f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int sub(void *a, void *b, void *c)
207f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
208f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
209f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(b != NULL);
210f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(c != NULL);
211f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mpz_sub(c, a, b);
212f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
213f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
214f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
215f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int subi(void *a, unsigned long b, void *c)
216f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
217f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
218f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(c != NULL);
219f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mpz_sub_ui(c, a, b);
220f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
221f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
222f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
223f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* mul */
224f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int mul(void *a, void *b, void *c)
225f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
226f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
227f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(b != NULL);
228f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(c != NULL);
229f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mpz_mul(c, a, b);
230f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
231f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
232f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
233f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int muli(void *a, unsigned long b, void *c)
234f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
235f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
236f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(c != NULL);
237f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mpz_mul_ui(c, a, b);
238f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
239f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
240f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
241f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* sqr */
242f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int sqr(void *a, void *b)
243f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
244f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
245f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(b != NULL);
246f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mpz_mul(b, a, a);
247f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
248f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
249f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
250f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* div */
251f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int divide(void *a, void *b, void *c, void *d)
252f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
253f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mpz_t tmp;
254f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
255f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(b != NULL);
256f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if (c != NULL) {
257f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      mpz_init(tmp);
258f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      mpz_divexact(tmp, a, b);
259f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
260f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if (d != NULL) {
261f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      mpz_mod(d, a, b);
262f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
263f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if (c != NULL) {
264f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      mpz_set(c, tmp);
265f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      mpz_clear(tmp);
266f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
267f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
268f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
269f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
270f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int div_2(void *a, void *b)
271f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
272f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
273f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(b != NULL);
274f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mpz_divexact_ui(b, a, 2);
275f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
276f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
277f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
278f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* modi */
279f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int modi(void *a, unsigned long b, unsigned long *c)
280f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
281f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
282f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(c != NULL);
283f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
284f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   *c = mpz_fdiv_ui(a, b);
285f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
286f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
287f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
288f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* gcd */
289f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int gcd(void *a, void *b, void *c)
290f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
291f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
292f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(b != NULL);
293f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(c != NULL);
294f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mpz_gcd(c, a, b);
295f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
296f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
297f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
298f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* lcm */
299f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int lcm(void *a, void *b, void *c)
300f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
301f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
302f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(b != NULL);
303f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(c != NULL);
304f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mpz_lcm(c, a, b);
305f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
306f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
307f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
308f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int mulmod(void *a, void *b, void *c, void *d)
309f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
310f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
311f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(b != NULL);
312f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(c != NULL);
313f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(d != NULL);
314f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mpz_mul(d, a, b);
315f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mpz_mod(d, d, c);
316f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
317f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
318f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
319f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int sqrmod(void *a, void *b, void *c)
320f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
321f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
322f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(b != NULL);
323f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(c != NULL);
324f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mpz_mul(c, a, a);
325f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mpz_mod(c, c, b);
326f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
327f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
328f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
329f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* invmod */
330f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int invmod(void *a, void *b, void *c)
331f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
332f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
333f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(b != NULL);
334f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(c != NULL);
335f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mpz_invert(c, a, b);
336f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
337f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
338f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
339f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* setup */
340f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int montgomery_setup(void *a, void **b)
341f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
342f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
343f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(b != NULL);
344f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   *b = (void *)1;
345f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
346f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
347f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
348f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* get normalization value */
349f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int montgomery_normalization(void *a, void *b)
350f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
351f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
352f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(b != NULL);
353f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mpz_set_ui(a, 1);
354f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
355f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
356f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
357f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* reduce */
358f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int montgomery_reduce(void *a, void *b, void *c)
359f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
360f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
361f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(b != NULL);
362f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(c != NULL);
363f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mpz_mod(a, a, b);
364f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
365f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
366f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
367f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* clean up */
368f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic void montgomery_deinit(void *a)
369f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
370f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
371f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
372f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int exptmod(void *a, void *b, void *c, void *d)
373f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
374f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
375f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(b != NULL);
376f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(c != NULL);
377f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(d != NULL);
378f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mpz_powm(d, a, b, c);
379f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
380f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
381f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
382f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int isprime(void *a, int *b)
383f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
384f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(a != NULL);
385f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(b != NULL);
386f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   *b = mpz_probab_prime_p(a, 8) > 0 ? LTC_MP_YES : LTC_MP_NO;
387f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
388f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
389f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
390f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectconst ltc_math_descriptor gmp_desc = {
391f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   "GNU MP",
392f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   sizeof(mp_limb_t) * CHAR_BIT - GMP_NAIL_BITS,
393f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
394f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &init,
395f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &init_copy,
396f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &deinit,
397f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
398f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &neg,
399f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &copy,
400f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
401f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &set_int,
402f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &get_int,
403f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &get_digit,
404f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &get_digit_count,
405f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &compare,
406f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &compare_d,
407f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &count_bits,
408f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &count_lsb_bits,
409f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &twoexpt,
410f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
411f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &read_radix,
412f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &write_radix,
413f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &unsigned_size,
414f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &unsigned_write,
415f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &unsigned_read,
416f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
417f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &add,
418f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &addi,
419f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &sub,
420f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &subi,
421f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &mul,
422f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &muli,
423f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &sqr,
424f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &divide,
425f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &div_2,
426f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &modi,
427f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &gcd,
428f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &lcm,
429f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
430f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &mulmod,
431f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &sqrmod,
432f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &invmod,
433f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
434f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &montgomery_setup,
435f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &montgomery_normalization,
436f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &montgomery_reduce,
437f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &montgomery_deinit,
438f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
439f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &exptmod,
440f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &isprime,
441f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
442f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef MECC
443f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef MECC_FP
444f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &ltc_ecc_fp_mulmod,
445f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
446f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &ltc_ecc_mulmod,
447f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif /* MECC_FP */
448f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &ltc_ecc_projective_add_point,
449f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &ltc_ecc_projective_dbl_point,
450f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &ltc_ecc_map,
451f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_ECC_SHAMIR
452f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef MECC_FP
453f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &ltc_ecc_fp_mul2add,
454f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
455f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &ltc_ecc_mul2add,
456f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif /* MECC_FP */
457f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
458f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   NULL,
459f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif /* LTC_ECC_SHAMIR */
460f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
461f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   NULL, NULL, NULL, NULL, NULL
462f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif /* MECC */
463f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
464f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef MRSA
465f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &rsa_make_key,
466f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   &rsa_exptmod,
467f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
468f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   NULL, NULL
469f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
470f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
471f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project};
472f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
473f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
474f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
475f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
476f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Source: /cvs/libtom/libtomcrypt/src/math/gmp_desc.c,v $ */
477f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Revision: 1.14 $ */
478f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Date: 2006/12/03 00:39:56 $ */
479