SM2加法同态加密

typedef struct {
  SM2_POINT C1;
  SM2_POINT C2;
} SM2_ELGAMAL_CIPHERTEXT;

SM2同态加密密文结构SM2_ELGAMAL_CIPHERTEXT包含两个椭圆曲线点C1C2

int sm2_elgamal_do_encrypt(const SM2_KEY *pub_key, uint32_t in, SM2_ELGAMAL_CIPHERTEXT *out);

以SM2公钥pub_key和明文in作为输入,计算同态密文out。函数执行成功返回1,失败返回-1。

int sm2_elgamal_do_decrypt(const SM2_KEY *key, const SM2_ELGAMAL_CIPHERTEXT *in, uint32_t *out);

以SM2密钥key和同态密文in作为输入,解密出明文out。函数执行成功返回1,失败返回-1。

int sm2_elgamal_ciphertext_add(SM2_ELGAMAL_CIPHERTEXT *r, const SM2_ELGAMAL_CIPHERTEXT *a, const SM2_ELGAMAL_CIPHERTEXT *b, const SM2_KEY *pub_key);
int sm2_elgamal_cipehrtext_sub(SM2_ELGAMAL_CIPHERTEXT *r, const SM2_ELGAMAL_CIPHERTEXT *a, const SM2_ELGAMAL_CIPHERTEXT *b, const SM2_KEY *pub_key);
int sm2_elgamal_cipehrtext_neg(SM2_ELGAMAL_CIPHERTEXT *r, const SM2_ELGAMAL_CIPHERTEXT *a, const SM2_KEY *pub_key);

以SM2同态密文ab(如果有)和SM2公钥pub_key作为输入,实现SM2同态密文的同态加、减、取负运算,并将结果写入SM2同态密文结构r中。函数执行成功返回1,失败返回-1。

int sm2_elgamal_ciphertext_scalar_mul(SM2_ELGAMAL_CIPHERTEXT *R, const uint8_t scalar[32], const SM2_ELGAMAL_CIPHERTEXT *A, const SM2_KEY *pub_key);

以SM2同态密文A、大整数scalar和SM2公钥pub_key作为输入,实现SM2同态密文的同态标量乘法运算,并将结果写入SM2同态密文结构R中。函数执行成功返回1,失败返回-1。

int sm2_elgamal_ciphertext_to_der(const SM2_ELGAMAL_CIPHERTEXT *c, uint8_t **out, size_t *outlen);
int sm2_elgamal_ciphertext_from_der(SM2_ELGAMAL_CIPHERTEXT *c, const uint8_t **in, size_t *inlen);

实现SM2同态密文信息在SM2_ELGAMAL_CIPHERTEXT结构和DER格式间的相互转换。函数执行成功返回1,失败返回-1。

int sm2_elgamal_encrypt(const SM2_KEY *pub_key, uint32_t in, uint8_t *out, size_t *outlen);
int sm2_elgamal_decrypt(SM2_KEY *key, const uint8_t *in, size_t inlen, uint32_t *out);

sm2_elgamal_do_encryptsm2_elgamal_do_decrypt功能相同,但SM2同态密文以DER格式的字节及其长度表示。函数执行成功返回1,失败返回-1。