| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- #ifndef _MONT_H
- #define _MONT_H
- #include "common.h"
- /*
- * How many numbers in Montgomery form a temporary scratchpad should contain.
- */
- #define SCRATCHPAD_NR 7
- typedef enum _ModulusType { ModulusGeneric, ModulusP256, ModulusP384, ModulusP521 } ModulusType;
- typedef struct mont_context {
- ModulusType modulus_type;
- unsigned words; /* Number of words allocated to hold the number */
- unsigned bytes; /* Number of bytes allocated to hold the number */
- unsigned modulus_len; /* Max bytes taken by an affine coordinate */
- uint64_t *modulus;
- uint64_t *one;
- uint64_t *r2_mod_n; /* R^2 mod N */
- uint64_t m0;
- uint64_t *r_mod_n; /* R mod N */
- uint64_t *modulus_min_2;
- } MontContext;
- int mont_context_init(MontContext **out, const uint8_t *modulus, size_t mod_len);
- void mont_context_free(MontContext *ctx);
- size_t mont_bytes(const MontContext *ctx);
- int mont_number(uint64_t **out, unsigned count, const struct mont_context *ctx);
- int mont_random_number(uint64_t **out, unsigned count, uint64_t seed, const struct mont_context *ctx);
- int mont_from_bytes(uint64_t **out, const uint8_t *number, size_t len, const MontContext *ctx);
- int mont_to_bytes(uint8_t *number, size_t len, const uint64_t* mont_number, const MontContext *ctx);
- int mont_add(uint64_t* out, const uint64_t* a, const uint64_t* b, uint64_t *tmp, const MontContext *ctx);
- int mont_mult(uint64_t* out, const uint64_t* a, const uint64_t *b, uint64_t *tmp, const MontContext *ctx);
- int mont_shift_left(uint64_t* out, const uint64_t* a, uint64_t k, const MontContext *ctx);
- int mont_sub(uint64_t *out, const uint64_t *a, const uint64_t *b, uint64_t *tmp, const MontContext *ctx);
- int mont_inv_prime(uint64_t *out, uint64_t *a, const MontContext *ctx);
- int mont_set(uint64_t *out, uint64_t x, const MontContext *ctx);
- int mont_is_zero(const uint64_t *a, const MontContext *ctx);
- int mont_is_one(const uint64_t *a, const MontContext *ctx);
- int mont_is_equal(const uint64_t *a, const uint64_t *b, const MontContext *ctx);
- int mont_copy(uint64_t *out, const uint64_t *a, const MontContext *ctx);
- #endif
|