package com.sunyard.chsm.sdf;


import com.sunyard.chsm.enums.Padding;
import com.sunyard.chsm.sdf.context.AlgId;
import com.sunyard.chsm.sdf.model.EccCipher;
import com.sunyard.chsm.sdf.model.EccKey;
import com.sunyard.chsm.sdf.model.EccSignature;


/**
 * @author liulu
 * @since 2024/10/23
 */
public interface SdfApiService {


    /**
     * 产生随机数
     *
     * @param len 随机数长度
     * @return 返回随机数
     */
    byte[] generateRandom(int len);


    /**
     * 生成对称密钥
     *
     * @param alg    算法，只支持对称算法
     * @param keyLen 密钥长度(bit)，只针对密钥长度可变的算法。
     *               禁止传 null
     * @return 对称密钥
     */
//    byte[] genSymKey(KeyAlg alg, Integer keyLen);
//
//    byte[] genSymKey(KeyAlg alg);


    /**
     * 对称加密
     *
     * @param alg     算法，只支持对称算法
     * @param padding
     * @param key     密钥值，明文
     * @param data    原始数据
     */
//    byte[] symEncrypt(KeyAlg alg, AlgMode mode, Padding padding, byte[] key, byte[] data);
//
//    byte[] symEncrypt(KeyAlg alg, byte[] key, byte[] data);

    byte[] symEncrypt(AlgId alg, Padding padding, byte[] key, byte[] iv, byte[] data);

    /**
     * 对称解密
     *
     * @param mode    轮模式
     * @param alg     算法，只支持对称算法
     * @param padding 填充模式
     * @param key     密钥值，明文
     * @param data    密文数据
     */
//    byte[] symDecrypt(KeyAlg alg, AlgMode mode, Padding padding, byte[] key, byte[] data);
//
//    byte[] symDecrypt(KeyAlg alg, byte[] key, byte[] data);

    byte[] symDecrypt(AlgId alg, Padding padding, byte[] key, byte[] iv, byte[] data);


    /**
     * 产生ECC密钥对并输出
     *
     * @return pubKey 返回公钥 | priKey 返回私钥
     */
    EccKey genKeyPairEcc();

    /**
     * 外部密钥ECC签名
     *
     * @param privateKey ECC私钥
     * @param pucData    缓冲区指针，用于存放外部输入的数据
     * @param userId     签名者id
     * @return pucSignature 返回签名值数据
     */
    EccSignature externalSignWithIdECC(byte[] privateKey, byte[] pucData, byte[] userId);

    EccSignature externalSignECC(byte[] privateKey, byte[] pucData);

    /**
     * 外部密钥ECC验证
     *
     * @param publicKey ECC公钥
     * @param pubData   原文
     * @param userId    签名者id
     * @param signData  外部签名数据
     * @return 0 成功;   非0 失败,返回错误代码
     */
    boolean externalVerifyWithIdECC(byte[] publicKey, byte[] pubData, byte[] signData, byte[] userId);

    boolean externalVerifyECC(byte[] publicKey, byte[] pubData, byte[] signData);


    /**
     * 外部密钥ECC公钥加密
     *
     * @param publicKey 外部ECC公钥结构
     * @param pucData   缓冲区指针，用于存放外部输入的数据
     * @return pucEncData 返回数据密文
     */
    EccCipher externalEncryptECC(byte[] publicKey, byte[] pucData);

    /**
     * 外部密钥ECC私钥解密
     *
     * @param privateKey 外部ECC私钥结构
     * @param encData    缓冲区指针，用于存放输入的数据密文
     * @return pucData 返回数据明文
     */
    byte[] externalDecryptECC(byte[] privateKey, byte[] encData);

    /**
     * 计算MAC
     *
     * @param algId algId
     * @param padding padding
     * @param symKey  用户指定的密钥
     * @param pucIv   缓冲区指针，用于存放输入和返回的IV数据
     * @param pucData 缓冲区指针，用于存放输入的数据明文
     * @return pucEncData 返回MAC值 | puiLength 返回MAC值长度
     */
    byte[] calculateMAC(AlgId algId, Padding padding, byte[] symKey, byte[] pucIv, byte[] pucData);

    byte[] hmac(byte[] key, byte[] srcData);

    /**
     * 杂凑运算
     *
     * @param pucData 缓冲区指针，用于存放输入的数据明文
     * @return hash值
     */
    byte[] hash(byte[] pucData);

    byte[] encryptByTMK(byte[] data);

    byte[] decryptByTMK(byte[] data);
}
