#ifndef RSA_H
#define RSA_H

#include <gmp.h>
#include <stdint.h>

#ifndef MODULUS_SIZE
#define MODULUS_SIZE 256ULL
#endif

typedef uint8_t u8;
typedef uint16_t u16;
typedef uint32_t u32;
typedef uint64_t u64;

typedef struct {
    mpz_t p;
    mpz_t q;
    mpz_t n;
    mpz_t e;
    mpz_t d;
} rsa_key;

typedef struct {
    mpz_t e;
    mpz_t n;
} rsa_public_key;

void rsa_print(const rsa_key *key);
void rsa_public_print(const rsa_public_key *pk);

int rsa_init(rsa_key *key);
void rsa_free(rsa_key *key);

int rsa_public_init(rsa_public_key *key);
void rsa_public_free(rsa_public_key *key);

size_t rsa_sign(u8 *sig, const u8 *sha256, const rsa_key *key);
int rsa_verify(const u8 *sig, const size_t sig_length, const u8 *sha256, const rsa_public_key *pk);

#endif