16#ifndef CRYPT_ELGAMAL_H
17#define CRYPT_ELGAMAL_H
19#include "hitls_build.h"
20#ifdef HITLS_CRYPTO_ELGAMAL
25#include "crypt_local_types.h"
26#include "bsl_params.h"
32#define ELGAMAL_MAX_MODULUS_BITS 16384
35typedef struct ELGAMAL_Ctx CRYPT_ELGAMAL_Ctx;
36typedef struct ELGAMAL_Para CRYPT_ELGAMAL_Para;
46CRYPT_ELGAMAL_Ctx *CRYPT_ELGAMAL_NewCtx(
void);
48CRYPT_ELGAMAL_Ctx *CRYPT_ELGAMAL_NewCtxEx(
void *libCtx);
59CRYPT_ELGAMAL_Ctx *CRYPT_ELGAMAL_DupCtx(CRYPT_ELGAMAL_Ctx *keyCtx);
78void CRYPT_ELGAMAL_FreeCtx(CRYPT_ELGAMAL_Ctx *ctx);
86void CRYPT_ELGAMAL_FreePara(CRYPT_ELGAMAL_Para *para);
101int32_t CRYPT_ELGAMAL_SetPara(CRYPT_ELGAMAL_Ctx *ctx,
const CRYPT_ElGamalPara *para);
103#ifdef HITLS_BSL_PARAMS
117int32_t CRYPT_ELGAMAL_SetParaEx(CRYPT_ELGAMAL_Ctx *ctx,
const BSL_Param *para);
129uint32_t CRYPT_ELGAMAL_GetBits(
const CRYPT_ELGAMAL_Ctx *ctx);
140uint32_t CRYPT_ELGAMAL_GetKBits(
const CRYPT_ELGAMAL_Ctx *ctx);
154int32_t CRYPT_ELGAMAL_Gen(CRYPT_ELGAMAL_Ctx *ctx);
178int32_t CRYPT_ELGAMAL_PubEnc(
const CRYPT_ELGAMAL_Ctx *ctx,
const uint8_t *input, uint32_t inputLen, uint8_t *out1,
179 uint32_t *out1Len, uint8_t *out2, uint32_t *out2Len);
202int32_t CRYPT_ELGAMAL_PrvDec(
const CRYPT_ELGAMAL_Ctx *ctx,
const BN_BigNum *c1,
const BN_BigNum *c2, uint32_t bits,
203 uint8_t *out, uint32_t *outLen);
220int32_t CRYPT_ELGAMAL_SetPrvKey(CRYPT_ELGAMAL_Ctx *ctx,
const CRYPT_ElGamalPrv *prv);
236int32_t CRYPT_ELGAMAL_SetPubKey(CRYPT_ELGAMAL_Ctx *ctx,
const CRYPT_ElGamalPub *pub);
249int32_t CRYPT_ELGAMAL_GetPrvKey(
const CRYPT_ELGAMAL_Ctx *ctx,
CRYPT_ElGamalPrv *prv);
262int32_t CRYPT_ELGAMAL_GetPubKey(
const CRYPT_ELGAMAL_Ctx *ctx,
CRYPT_ElGamalPub *pub);
264#ifdef HITLS_BSL_PARAMS
280int32_t CRYPT_ELGAMAL_SetPrvKeyEx(CRYPT_ELGAMAL_Ctx *ctx,
const BSL_Param *para);
296int32_t CRYPT_ELGAMAL_SetPubKeyEx(CRYPT_ELGAMAL_Ctx *ctx,
const BSL_Param *para);
309int32_t CRYPT_ELGAMAL_GetPrvKeyEx(
const CRYPT_ELGAMAL_Ctx *ctx, BSL_Param *para);
322int32_t CRYPT_ELGAMAL_GetPubKeyEx(
const CRYPT_ELGAMAL_Ctx *ctx, BSL_Param *para);
345int32_t CRYPT_ELGAMAL_Encrypt(CRYPT_ELGAMAL_Ctx *ctx,
const uint8_t *data, uint32_t dataLen, uint8_t *out,
368int32_t CRYPT_ELGAMAL_Decrypt(CRYPT_ELGAMAL_Ctx *ctx,
const uint8_t *data, uint32_t dataLen, uint8_t *out,
379int32_t CRYPT_ELGAMAL_GetSecBits(
const CRYPT_ELGAMAL_Ctx *ctx);
397int32_t CRYPT_ELGAMAL_Ctrl(CRYPT_ELGAMAL_Ctx *ctx, int32_t opt,
void *val, uint32_t len);
399#ifdef HITLS_CRYPTO_ELGAMAL
413int32_t OriginalRoot(
void *libCtx, BN_BigNum *g,
const BN_BigNum *p,
const BN_BigNum *q, uint32_t bits);