blob: c28ff319144d0ac730f4c10ef34c80002a975c4b [file] [log] [blame]
#include <stdbool.h>
#include <stdint.h>
#include <string.h>
#include <rsa.h>
#if defined(__aarch64__)
typedef __uint128_t uint128_t;
typedef uint128_t uintptr2_t;
#elif defined(__arm__)
typedef uint64_t uintptr2_t;
#else
#error Unsupport architecture
#endif
#define N_BYTES (2048 / 8)
#define N_WORDS (N_BYTES / sizeof(uintptr_t))
int bn_mul_mont(uintptr_t *rp, const uintptr_t *ap, const uintptr_t *bp,
const uintptr_t *np, const uint64_t *n0, int num);
void mod_exp_65537_mont(uintptr_t *r, const uintptr_t *a, const struct key_prop *pkey)
{
const uintptr_t *m, *rr;
uint64_t n0inv;
uint32_t n_words;
size_t i;
m=pkey->modulus;
rr=pkey->rr;
n0inv=pkey->n0inv;
n_words=(pkey->num_bits/8)/sizeof(uintptr_t);
uintptr_t ar[n_words];
bn_mul_mont(ar, a, rr, m, &n0inv, n_words);
bn_mul_mont(r, ar, ar, m, &n0inv, n_words);
for (i = 15; i != 0; i--)
bn_mul_mont(r, r, r, m, &n0inv, n_words);
bn_mul_mont(r, r, ar, m, &n0inv, n_words);
memset(ar, 0, sizeof(ar));
ar[0] = 1;
bn_mul_mont(r, r, ar, m, &n0inv, n_words);
}