#ifndef _Crypto_H_
#define _Crypto_H_

#include <cstdlib>
#include <string>
#include <vector>
#include <sstream>
#include <iostream>
#include <iomanip>

#include <gmssl/sm2.h>
#include <gmssl/sm3.h>
#include <gmssl/sm4.h>
#include <gmssl/hex.h>
#include <gmssl/asn1.h>
#include <gmssl/rand.h>
#include <gmssl/error.h>
#include <gmssl/pkcs8.h>

#include <openssl/evp.h>
#include <openssl/ec.h>
#include <openssl/pem.h>
#include <openssl/err.h>
#include <openssl/bio.h>
#include <openssl/bn.h>


using namespace std;


class Crypto
{
public:
	static string md5(string data);

    static string sm3(std::string data);


    static std::string gmssl_sm2Encrypt(std::string pubKeyHex, std::string priKeyHex, std::string plain);
    static std::string gmssl_sm2Decrypt(std::string pubKeyHex, std::string priKeyHex, std::string cipher);


    /**
     * @brief SM4-ECB 加密示例
     * @param key 16字节密钥
     * @param plaintext 明文数据
     * @return 密文字节向量
     */
    static std::vector<uint8_t> sm4EcbEncrypt(const std::vector<uint8_t>& key, const std::vector<uint8_t>& plaintext);

    /**
     * @brief SM4-ECB 解密示例
     * @param key 16字节密钥
     * @param ciphertext 密文数据
     * @return 明文字节向量
     */
    static std::vector<uint8_t> sm4EcbDecrypt(const std::vector<uint8_t>& key, const std::vector<uint8_t>& ciphertext);


    static std::string ssl_sm2Encrypt(const std::string& public_key_hex, const std::string& plaintext);
    static std::string ssl_sm2Decrypt(const std::string& private_key_hex, const std::string& ciphertext);

    static EVP_PKEY* create_sm2_private_key_from_hex(const std::string& private_key_hex);
    static EVP_PKEY* create_sm2_public_key_from_hex(const std::string& public_key_hex);
};

#endif // ! _Crypto_H_